想要做一個程序,實現右鍵菜單“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:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\regasm
如果您使用Windows 64位,請確保使用x64版本的regasm注冊服務器:
C:\WINDOWS\Microsoft.NET\Framework64\v4.0.30319\regasm
4:如果您正在注冊未安裝在GAC中的服務器,請確保使用'/ codebase'標志。
regasm MyServer.dll /register /codebase
重要提示:對於大多數SharpShell服務器,除了開發機器以外,其他任何服務器都必須使用SharpShell在Release模式下的生成文件。 該文件使用非調試C ++組件,它在調試模式下具有與MSVCRTD100.dll相關的依賴關系 - 這不會出現在非開發機器上。