吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2920|回复: 0
收起左侧

[其他转载] c# 添加系统右键菜单

  [复制链接]
bjszz 发表于 2022-3-16 11:12
本帖最后由 bjszz 于 2022-3-16 11:21 编辑

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

      
[C#] 纯文本查看 复制代码
[COMServerAssociation(AssociationType.AllFiles), COMServerAssociation(AssociationType.Directory)]
       [ComVisible(true)]  
       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);

           
        }

    }


以上代码是完成添加右键菜单,然后点击右键菜单复制文件路径。
   
具体实现注册系统服务的代码如下:
[C#] 纯文本查看 复制代码
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的获取:
[C#] 纯文本查看 复制代码
  String path = Environment.GetCommandLineArgs()[0];

代码如下:
[C#] 纯文本查看 复制代码
 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函数中添加如下代码:
[C#] 纯文本查看 复制代码
 static void Main()
        {

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



以上两种方法各有利弊,都不是很完美,不知道还有没有第三种添加系统右键菜单的方法,谢谢大家

免费评分

参与人数 2吾爱币 +1 热心值 +2 收起 理由
zich123 + 1 + 1 用心讨论,共获提升!
tb612443 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 10:00

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表