本帖最后由 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());
}
}
以上两种方法各有利弊,都不是很完美,不知道还有没有第三种添加系统右键菜单的方法,谢谢大家 |