添加右鍵菜單可以用注冊表的shell項或shellex項,。 1 shell項我用過的每臺電腦都會被我加上: Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT/Folder/shell/command prompt/command] @="cmd.exe" 即將注冊表“HKEY_CLASSES_ROOT/Folder/shell/command prompt/command”的默認(rèn)值設(shè)為“cmd.exe”。這樣我就可以從命令行快速進(jìn)入指定目錄。 HKEY_CLASSES_ROOT有很多表示文件類型的鍵。Folder表示文件夾,*表示所有文件。在文件類型下增加“shell/提示字符串/command”項,并將該項的值設(shè)為對應(yīng)的命令行,。這樣在資源管理器對應(yīng)文件類型上點右鍵時,菜單中就會有一個菜單項的內(nèi)容是“提示字符串”,,選擇這個菜單項就會執(zhí)行在command項設(shè)置的命令,。再看一個例子: Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT/dllfile/shell/Register Component/command] @="regsvr32 /"%L/"" [HKEY_CLASSES_ROOT/dllfile/shell/Unregister Component/command] @="regsvr32 /u /"%L/"" [HKEY_CLASSES_ROOT/ocxfile/shell/Register Component/command] @="regsvr32 /"%L/"" [HKEY_CLASSES_ROOT/ocxfile/shell/Unregister Component/command] @="regsvr32 /u /"%L/"" [HKEY_CLASSES_ROOT/exefile/shell/Register Component/command] @="/"%L/" /regserver" [HKEY_CLASSES_ROOT/exefile/shell/Unregister Component/command] @="/"%L/" /unregserver" 這個例子給類型dllfile、ocxfile,、exefile增加了“Register Component”和“Unregister Component”命令,。這樣我們可以直接通過右鍵菜單注冊或卸載組件。在HKEY_CLASSES_ROOT下可以看到.dll,、.ocx,、.exe的默認(rèn)值指向了dllfile、ocxfile,、exefile,。 shell項適合比較簡單的命令。如果右鍵菜單要實現(xiàn)比較復(fù)雜的功能,,我們就要使用Windows的shell擴(kuò)展編程接口,,即使用shellex項。 2 shellex項2.1 實現(xiàn)shell擴(kuò)展的COM組件UltraEdit的右鍵菜單用起來很方便,。那么它是怎么實現(xiàn)的呢,?在注冊表里可以看到: [HKEY_CLASSES_ROOT/*/shellex/ContextMenuHandlers/UltraEdit-32] @="{b5eedee0-c06e-11cf-8c56-444553540000}" “{b5eedee0-c06e-11cf-8c56-444553540000}”是一個COM組件的uuid。在“HKEY_CLASSES_ROOT/CLSID”下可以找到 Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT/CLSID/{b5eedee0-c06e-11cf-8c56-444553540000}] @="UltraEdit" [HKEY_CLASSES_ROOT/CLSID/{b5eedee0-c06e-11cf-8c56-444553540000}/InProcServer32] @="C://Program Files//IDM Computer Solutions//UltraEdit-32//ue32ctmn.dll" "ThreadingModel"="Apartment" ue32ctmn.dll就是UltraEdit提供的實現(xiàn)了shell擴(kuò)展功能的COM組件,。這個COM組件如果實現(xiàn)了IContextMenu接口,,就可以增加右鍵菜單。菜單項的圖標(biāo)文本是在IContextMenu接口的QueryContextMenu函數(shù)中指定的,。用戶選擇菜單項后,,Windows會調(diào)用IContextMenu接口的InvokeCommand函數(shù),我們在這個函數(shù)中實現(xiàn)菜單對應(yīng)的功能,。 我們通常用ATL實現(xiàn)COM組件,。因為VC提供了完善的向?qū)В杂肁TL實現(xiàn)一個COM組件其實并不復(fù)雜,。在網(wǎng)上可以找到一篇叫作《Windows Shell擴(kuò)展編程完全指南》的chm,,包含了實現(xiàn)shell擴(kuò)展編程的詳細(xì)指導(dǎo)。這是翻譯的文章,,chm中也包括了原文(因為轉(zhuǎn)載需要譯者同意,,我就不提供下載了)。示例代碼可以從原文網(wǎng)站下載,,我也整理了 一份,。使用ALT向?qū)?,再仿照示例代碼,我們很容易建立自己的工程,。然后在QueryContextMenu和InvokeCommand函數(shù)中定制自己的菜單項顯示和功能??梢园选禬indows Shell擴(kuò)展編程完全指南》當(dāng)作游戲攻略,,找到自己感興趣的部分,照著做就行了,。 2.2 添加和移除菜單添加菜單除了注冊組件外,,只要在對應(yīng)文件類型下增加一項“shellex/ContextMenuHandlers/描述性名稱”,并將該項的值設(shè)為組件的uuid,。uuid是在建立ATL工程時自動生成的,。注冊組件也是通過在注冊表添加一些項目完成的。移除菜單時只要刪除注冊表的相應(yīng)項目就可以了,。 請注意,,“shellex/ContextMenuHandlers”下的“描述性名稱”雖然沒什么用,但應(yīng)該能讓用戶看明白這個擴(kuò)展是哪個程序加的,。例如“Beyond Compare 2”就起了一個奇怪的名字,,所以被我刪掉了。后來我發(fā)現(xiàn)BC2的右鍵菜單沒有了,,就在CLSID中找到BC2的dll文件的uuid,,然后在“*/shellex/ContextMenuHandlers”加了個 “BC2”項,默認(rèn)值填上uuid就可以了,。 組件相關(guān)的注冊表項目可以見建立ATL工程時自動生成的rgs文件,,以及DllRegisterServer和DllUnregisterServer函數(shù)。 以cnbook為例,,增加右鍵菜單需要增加以下注冊表項目: Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT/*/shellex/ContextMenuHandlers/cnbook] @="{5BB33E44-519C-42A8-8ABF-81478C57A503}" [HKEY_CLASSES_ROOT/CLSID/{5BB33E44-519C-42A8-8ABF-81478C57A503}] @="Shellapi.OpenExt" [HKEY_CLASSES_ROOT/CLSID/{5BB33E44-519C-42A8-8ABF-81478C57A503}/InProcServer32] @="D://projects//cnbook//cnbook//shellapi.dll" "ThreadingModel"="Apartment" [HKEY_CLASSES_ROOT/CLSID/{5BB33E44-519C-42A8-8ABF-81478C57A503}/ProgID] @="Shellapi.OpenExt" [HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Shell Extensions/Approved] "{5BB33E44-519C-42A8-8ABF-81478C57A503}"="Shellapi.OpenExt" 只要刪除這些項目就可以移除菜單,。 ProgID就是在插入ATL對象時填寫的ATL對象名稱。組件路徑可以在程序中根據(jù)應(yīng)用程序所在目錄確定,。 |
|