C# 将上下文菜单项插入资源管理器,并在单击上下文菜单项时传递完整的文件名

C# 将上下文菜单项插入资源管理器,并在单击上下文菜单项时传递完整的文件名,c#,.net,windows,shell,contextmenu,C#,.net,Windows,Shell,Contextmenu,我想为所有“jpg”文件向windows资源管理器上下文菜单添加上下文菜单项。当用户单击此项时,上下文菜单项的名称将为“process JPEG”,将调用一个主可执行文件。问题是我已经创建了主c#可执行文件,它不仅可以通过上下文菜单运行,还可以独立运行。我想将用户选择并单击上下文菜单命令的文件名传递给主可执行文件,因此,主可执行文件将能够使用某种方法获取文件并处理这些文件 public static void Register( string fileType, stri

我想为所有“jpg”文件向windows资源管理器上下文菜单添加上下文菜单项。当用户单击此项时,上下文菜单项的名称将为“process JPEG”,将调用一个主可执行文件。问题是我已经创建了主c#可执行文件,它不仅可以通过上下文菜单运行,还可以独立运行。我想将用户选择并单击上下文菜单命令的文件名传递给主可执行文件,因此,主可执行文件将能够使用某种方法获取文件并处理这些文件

public static void Register(
            string fileType, string shellKeyName, 
            string menuText, string menuCommand)
        {
            Debug.Assert(!string.IsNullOrEmpty(fileType) &&
                !string.IsNullOrEmpty(shellKeyName) &&
                !string.IsNullOrEmpty(menuText) && 
                !string.IsNullOrEmpty(menuCommand));

            // create full path to registry location
            string regPath = string.Format(@"{0}\shell\{1}", fileType, shellKeyName);

            // add context menu to the registry
            using (RegistryKey key = Registry.ClassesRoot.CreateSubKey(regPath))
            {
                key.SetValue(null, menuText);
            }

            // add command that is invoked to the registry
            using (RegistryKey key = Registry.ClassesRoot.CreateSubKey(
                string.Format(@"{0}\command", regPath)))
            {               
                key.SetValue(null, menuCommand);
            }
        }
要在旧版本的Windows上为注册谓词,请执行以下操作:

  • 拿到票。在您的情况下,请阅读
    HKCR\.jpg
    下的默认值(这通常会提供类似
    jpgfile
  • HKCR\%ProgId%\shell\%YourVerb%\command
  • 从XP开始,您可以在SystemFileAssociations下注册补充动词,而无需控制ProgID:

  • HKCR\SystemFileAssociations\.jpg\shell\%YourVerb%\command
  • 谓词命令通常是
    “c:\full\path\to\yourapp.exe”“%1”
    ,windows会将%1替换为文件名。应用程序必须解析命令行


    要正确支持同时打开多个文件,最好使用(或在Win7+)

    我已成功地将单个文件的名称传递给主应用程序,但如果我选择多个文件,则会多次调用应用程序。如何避免这种情况。@techno:DDE,IDropTarget,IExecuteCommand或某种形式的自定义进程间通信,其中附加进程与初始进程通信,并让它打开文件…谢谢。您能给我一个例子来说明这一点吗DDE@technoDDE是一种弃用的技术,除非你支持Win XP,否则你真的应该考虑使用其他东西。不管怎样,我都不能在评论中帮你,所以。。。