想要做一个程序,实现右键菜单“Copy Full Path”,经常需要复制文件或文件夹完全路径
然后找到一个大神写的类库SharpShell,可以用Nuget安装到项目
1.首先创建一个.NET的类库项目
2.添加一个类,继承SharpShell.SharpContextMenu.SharpContextMenu。会要你实现两个方法:
CanShowMenu和CreateMenu
顾名思义,CanShowMenu就是用来判断当前选择的文件或文件夹是否可以激活显示菜单的
基本上直接return true,除非你要根据所选文件的内容或者文件属性等等乱七八糟的元素来做判断,至于文件类型的判断,不需要在这里面写,下文会说明为什么。
而CreateMenu则是创建一个菜单项,可以添加图标啊,文字啊,级联菜单什么的。返回一个菜单类。
3.具体实现。因为我的需求很明确了,直接贴代码:
public class CopyFullPathExtension : SharpContextMenu { /// <summary> /// 判断菜单是否需要被激活显示 /// </summary> /// <returns></returns> protected override bool CanShowMenu() { return true; } /// <summary> /// 创建一个菜单,包含菜单项,设置ICON, /// </summary> /// <returns></returns> protected override ContextMenuStrip CreateMenu() { var menu = new ContextMenuStrip(); //设定菜单项显示文字 var item = new ToolStripMenuItem("Copy Full Path"); //添加监听事件 item.Click += Item_Click; //设置图像及位置 //item.Image = XXX //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); } }
很简单的代码,就是添加一个名为“Copy Full Path”的菜单,选中后向剪切板设置选择的文件或文件夹的完全路径。
4.确保你的COM可见,在类上添加Attribute
[ComVisible(true)] public class CopyFullPathExtension : SharpContextMenu {
5.为你的项目添加一个签名,项目-》属性-》签名-》为程序集签名-》新建-》加不加密码您随意
6.添加文件过滤Attribute
[COMServerAssociation(AssociationType.AllFiles),COMServerAssociation(AssociationType.Directory)] public class CopyFullPathExtension : SharpContextMenu {
这就是为什么文件格式过滤不需要在CanShowMenu中写的原因了,AssociationType提供了很多类型,因为我不需要做任何判断,并且支持文件夹,你就像我这么写,如果你需要过滤特定文件类型
你可能需要这么写:
COMServerAssociation(AssociationType.ClassOfExtension,".txt",".xxx")
7然后就发布,至于怎么添加COM Server到系统。大神说了
用微软的RegASM
或者用它提供的Server Manager
或者,也许你可以手动注册
白白。
*8.对了,如果菜单不显示的话,和博主无关。欢迎对号入座:
1:确保您的服务器类具有[ComVisbile(true)]属性。
2:确保您的程序集是COM可见(项目属性>应用程序>程序集信息...>“使程序集COM可见”)。
3:如果您在Windows 32位,请确保使用x86版本的regasm注册服务器:
C:WINDOWSMicrosoft.NETFrameworkv4.0.30319
egasm
如果您使用Windows 64位,请确保使用x64版本的regasm注册服务器:
C:WINDOWSMicrosoft.NETFramework64v4.0.30319
egasm
4:如果您正在注册未安装在GAC中的服务器,请确保使用'/ codebase'标志。
regasm MyServer.dll /register /codebase
重要提示:对于大多数SharpShell服务器,除了开发机器以外,其他任何服务器都必须使用SharpShell在Release模式下的生成文件。 该文件使用非调试C ++组件,它在调试模式下具有与MSVCRTD100.dll相关的依赖关系 - 这不会出现在非开发机器上。