如何在C#的Windows资源管理器上下文菜单中获取所选文件的文件路径?

时间:2015-03-17 04:51:58

标签: c# filepath windows-explorer

我已经使用Visual Studio 2012 WindowsForm C#创建了一个音乐播放器,现在我想像其他任何播放器(Windows Media Player,Winamp,MpcStar,VLC ......)那样播放/添加Windows资源中的歌曲!所以我认为这不会真的很难!其中一些程序很简单!

所以例如:我在资源管理器的目录中选择3首歌曲并右键单击它们并选择"播放"然后他们应该使用我的应用程序添加功能添加到播放列表并开始播放!如果用户按Enter键也应该执行此操作!

如果用户选择"添加到播放列表"歌曲应该只添加到我的播放列表中(不能取代以前的播放列表歌曲)

我不想让你创建我的程序我只需要一个答案就知道如何通过windows explorer context-menu获取所有选定文件的路径!

***我想让所有选定的文件路径不仅仅是单个文件!

**更新:我找到了解决方案!我在下面发布了答案!希望它也有助于其他人:)

1 个答案:

答案 0 :(得分:1)

好吧最后我得到了解决方案:)

此链接帮助我通过单击上下文菜单项获取资源管理器中所选文件的路径: .NET Shell Extensions - Shell Context Menus

真的很容易:)

这是步骤:

1)下载SharpShell库>>

下载文章顶部的“SharpShell Library”压缩文件,并添加对下载的SharpShell.dll文件的引用。

或者您可以通过Nuget下载:

如果您安装了Nuget,只需快速搜索SharpShell并直接安装 - 或者在https://www.nuget.org/packages/SharpShell获取包裹详情。

添加以下参考文献:

System.Windows.Forms
System.Drawing

在代码顶部使用这些代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SharpShell;
using SharpShell.SharpContextMenu;
using System.Windows.Forms;
using System.IO;
using System.Runtime.InteropServices;
using SharpShell.Attributes;

SharpContextMenu导出您的班级  右键单击该行的SharpContextMenu部分,然后选择Implement Abstract Class

CanShowMenu

调用此函数以确定是否应显示给定文件集的上下文菜单扩展。用户选择的文件位于属性SelectedItemPaths中。我们可以检查这些文件路径,看看我们是否真的要显示菜单。如果应显示菜单,请返回true。如果没有,请返回false

CreateMenu

调用此函数以实际创建上下文菜单。我们需要返回一个标准的WinForms ContextMenuStrip

这是整个命名空间SourceCode:

namespace CountLinesExtension
{
[ComVisible(true)]
[COMServerAssociation(AssociationType.ClassOfExtension, ".txt")]
public class Class1 : SharpContextMenu
{
protected override bool CanShowMenu()
{
        //  We will always show the menu.
        return true;
        //throw new NotImplementedException();
    }

    protected override ContextMenuStrip CreateMenu()
    {
        //  Create the menu strip.
        var menu = new ContextMenuStrip();

        //  Create a 'count lines' item.
        var itemCountLines = new ToolStripMenuItem
        {
            Text = "Count Lines"
        };

        //  When we click, we'll call the 'CountLines' function.
        itemCountLines.Click += (sender, args) => CountLines();

        //  Add the item to the context menu.
        menu.Items.Add(itemCountLines);

        //  Return the menu.
        return menu;
        //throw new NotImplementedException();
    }
    private void CountLines()
    {
        //  Builder for the output.
        var builder = new StringBuilder();

        //  Go through each file.
        foreach (var filePath in SelectedItemPaths)
        {
            //  Count the lines.
            builder.AppendLine(string.Format("{0} - {1} Lines",
              Path.GetFileName(filePath), File.ReadAllLines(filePath).Length));
        }

        //  Show the ouput.
        MessageBox.Show(builder.ToString());
    } 

}
}

接下来,我们必须给大会一个强有力的名字。有一些方法可以解决这个问题,但通常这是最好的方法。为此,右键单击项目并选择“属性”。然后去'签名'。选择“签署程序集”,为密钥指定“新建”并选择密钥名称。您可以根据需要使用密码保护密钥,但不是必需的

现在安装并注册Shell扩展: regasm工具

您可以使用工具'regasm'来安装和注册shell扩展。使用regasm时,shell扩展将安装到注册表中(即COM服务器的类ID将放在COM服务器类部分并与实际服务器文件的路径相关联),它还将注册关联。

服务器管理器工具

服务器管理器工具是我首选的安装/卸载和注册/取消注册的方法,至少在开发期间,因为它允许您作为单独的步骤进行安装和注册。它还允许您指定是以32位还是64位模式安装/卸载等。

这是整个Sample sourceCode。我们可以添加任意数量的上下文菜单项,任何函数,任何文件扩展等。

例如,我将使用'.mp3'FileExtensions并将Countlines Function更改为将SelectedItemPaths发送到播放列表和其余操作的函数。

希望这也有助于其他人!