bjszz 发表于 2022-3-16 11:12

c# 添加系统右键菜单

本帖最后由 bjszz 于 2022-3-16 11:21 编辑

最近研究系统右键菜单,目前测试了两种方式,都成功了,和大家分享交流一下。
一、通过别人写的SharpShell类来添加。
Nuget来安装,网上有一篇文章
来自博客园:https://www.cnblogs.com/CodeSnippet/p/7240378.html
他安装了两个Nuget包,第二个包SharpShelltools提供的Server Manager
按照作者的意思是使用第二个包来注册服务到系统,然后就能看到右键添加的菜单了
我这次用了另外一个Nuget包
ServerRegistrationManager
添加右键的代码如下:

      
      
       public class DirectoryBackgroundContextMenu : SharpContextMenu
       {
      public DirectoryBackgroundContextMenu() { }

      protected override bool CanShowMenu()
      {
            return true;
      }

      protected override ContextMenuStrip CreateMenu()
      {
         
            var menu = new ContextMenuStrip();
            //设定菜单项显示文字
            var item = new ToolStripMenuItem("右键复制");
            //添加监听事件
            item.Click += Item_Click;

            //设置图像及位置

            //item.Image = ioo图标;
            //item.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;

            menu.Items.Add(item);

            return menu;
      }
      private void Item_Click(object sender, EventArgs e)
      {

            foreach (var path in SelectedItemPaths)
                Clipboard.SetText(path);

         
      }

    }

以上代码是完成添加右键菜单,然后点击右键菜单复制文件路径。
   
具体实现注册系统服务的代码如下:
public static class Env
    {
      public const string AppName = "程序名";
      public const string MenuDisplay = AppName + "(&C)";
      public const string CommandFileName = ".程序名.yaml";
      public const string GlobalSettingFileName = "global.程序名.yaml";
      public const string GlobalTemplateSettingFileName = "global.template.程序名.yaml";

      public const string SrmExeName = "ServerRegistrationManager.exe";
      public const string LogFileName = "log.txt";

      public const string CreateFolderSpecificFileText = "Create .程序名.yaml";
      public const string OpenGlobalSettingFileText = "Edit Global Setting";
      public const string OpenAppText = "Open 程序名";

      public const string ConfigTitle = "# 程序名: https://github.com/XUJINKAI/程序名 \r\n\r\n";

      public const string VAR_DIR = "%DIR%";
      public const string VAR_SEPNAME = "---";
    }

这里引用了
https://github.com/XUJINKAI/XJKdotNetLibrary/tree/dbaeba0b1fce06c655f1465708ff939f209aa2f2
github上封装好的类库,来注册服务。
类库的开发者也写了一个添加系统右键的程序是用wpf实现的,
我在winform上也测试成功。他的代码可以去他仓库下载
我的代码稍后分享。

二、用注册表实现添加系统菜单。
方法:通过改写注册表实现
  一、给所有类型的文件添加自定义的右键菜单
  HKEY_CLASSES_ROOT\*\shell
        HKEY_CLASSES_ROOT\*\shell\自定义的菜单名
        HKEY_CLASSES_ROOT\*\shell\自定义的菜单名\command
          值名称:(默认)   类型:REG_SZ      数据:关联程序的完全限定名称
  二、给所有文件夹添加自定义的右键菜单
    HKEY_CLASSES_ROOT\Directory\shell
        HKEY_CLASSES_ROOT\Directory\shell\自定义的菜单名
        HKEY_CLASSES_ROOT\Directory\shell\自定义的菜单名\command
          值名称:(默认)   类型:REG_SZ      数据:关联程序的完全限定名称
虽然代码写起来也很方便,但是后续开发有点麻烦,

path的获取:
String path = Environment.GetCommandLineArgs();
代码如下:
private Boolean createWithIcon(String where, String path)
      {
            try
            {
                RegistryKey registryKey = Registry.ClassesRoot.CreateSubKey(where + "\\shell\\自定义");
                registryKey.SetValue("", "右键菜单");
                registryKey.SetValue("Icon", path);
                RegistryKey openFileCommand = registryKey.CreateSubKey("command");
                openFileCommand.SetValue("", "\"" + path + "\" " + "%1");

                registryKey.Close();
                openFileCommand.Close();

                return true;
            }
            catch
            {
                return false;
            }
      }

如果想实现右键复制文件路径的功能在winform 的main函数中添加如下代码:
static void Main()
      {

            String[] args = Environment.GetCommandLineArgs();
            if (args.Length > 1)
            {
                String path = "";
                for (int i = 1; i < args.Length; i++)
                {
                  path = path + args + " ";
                }
                Clipboard.SetText(path.Trim());
            }
            else
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1());
            }
      }


以上两种方法各有利弊,都不是很完美,不知道还有没有第三种添加系统右键菜单的方法,谢谢大家
页: [1]
查看完整版本: c# 添加系统右键菜单