註冊 Shell 擴展處理器
Shell擴展處理程式必須先註冊,Shell才能使用它。 本主題是如何註冊 Shell 延伸模組處理程式的一般討論。
每當您建立或變更 Shell 擴充處理程式時,請務必通知系統您已進行變更。 藉由呼叫 SHChangeNotify,指定 SHCNE_ASSOCCHANGED 事件來執行此動作。 如果您未呼叫 SHChangeNotify,則在系統重新啟動之前,可能無法辨識變更。
有一些其他因素適用於 Windows 2000 系統。 如需詳細資訊,請參閱在 Windows 2000 Systems 上註冊殼層延伸模組處理程式 一節。
如同所有元件物件模型 (COM) 物件,您必須使用 windows 軟體開發工具包 (SDK) 提供的 Guidgen.exe之類的工具來建立處理程式的 GUID。 HKEY_CLASSES_ROOT\CLSID 底下建立子機碼, 其名稱為該 GUID 的字串形式。 因為殼層擴充處理程式是同進程伺服器,因此您也必須在該 GUID 子機碼底下建立 InprocServer32 子機碼,並將 [預設值] 值設定為處理程式 DLL 的路徑。 使用 Apartment 線程模型。 以下顯示範例:
HKEY_CLASSES_ROOT
CLSID
{00021500-0000-0000-C000-000000000046}
InprocServer32
(Default) = %windir%\System32\Example.dll
ThreadingModel = Apartment
每當 Shell 採取可能涉及到 Shell 擴充處理程式的動作時,它會檢查適當的登錄子機碼。 子機碼,在呼叫擴充處理程式時會註冊控件。 例如,當殼層顯示 檔類型成員的快捷方式功能表時,呼叫快捷方式功能表處理程式是常見的作法。 在此情況下,處理程式必須在檔類型的 ProgID 子機碼下註冊。
本主題討論下列主題:
處理程式名稱
若要啟用殼層擴充處理程式,請使用處理程式子機碼名稱在 ShellEx 子機碼下建立子機碼(如下所示),以在 ProgID(適用於檔案類型)或 Shell 物件類型名稱(適用於 predefined_shell_objects)中使用。
例如,如果您想要註冊 MyProgram.1 的快捷方式功能表延伸模組處理程式,請從建立下列子機碼開始:
HKEY_CLASSES_ROOT
MyProgram.1
ShellEx
ContextMenuHandlers
針對下列處理常式,請在「處理常式子機碼名稱」之下建立一個子機碼,此子機碼名稱為殼層擴充功能的類別識別碼(CLSID)的字串表示形式。 建立多個子機碼,即可在處理程式子機碼名稱下註冊多個延伸模組。
控制器 | 介面 | 處理器子鍵名稱 |
---|---|---|
欄位提供者處理程式 | IColumnProvider | ColumnHandlers |
快捷功能表處理程式 | IContextMenu | ContextMenuHandlers |
Copyhook 處理程式 | ICopyHook | 複製掛鉤處理程序 |
拖放處理程式 | IContextMenu | DragDropHandlers |
屬性表處理程式 | IShellPropSheetExt | 屬性表單處理器 |
針對下列處理程式,「處理程式副機碼名稱」機碼的預設值是 Shell 擴充功能的 CLSID 字串版本。 這些處理程式只能註冊一個擴充功能。
處理器 | 介面 | 處理程序子機碼名稱 |
---|---|---|
數據處理者 | IDataObject | DataHandler |
拖放處理程序 | IDropTarget | DropHandler |
圖示處理程式 | IExtractIconA/W | IconHandler |
縮圖影像處理程式 | IThumbnailProvider | {E357FCCD-A995-4576-B01F-234630154E96} |
資訊提示處理程式 | IQueryInfo | {00021500-0000-0000-C000-000000000046} |
Shell 連結 (ANSI) | IShellLinkA | {000214EE-0000-0000-C000-000000000046} |
Shell 連結 (UNICODE) | IShellLinkW | {000214F9-0000-0000-C000-000000000046} |
結構化記憶體 | IStorage | {0000000B-0000-0000-C000-000000000046} |
元數據 | IPropertySetStorage | PropertyHandler |
釘選到 [開始] 功能表 | IStartMenuPinnedList (開始選單釘選列表) | {a2a9545d-a0c2-42b4-9708-a0b2badd77c8} |
釘選到任務列 | {90AA3A4E-1CBA-4233-B8BB-535773D48449} |
指定用來將 [釘選到開始] 功能表 的子機碼,[釘選到任務欄] 至專案的快捷方式功能表,只有在 包含 isShortCut 項目的檔類型才需要。
預先定義的Shell物件
Shell 會在 HKEY_CLASSES_ROOT 下定義其他對象,其延伸方式與檔類型相同。 例如,若要新增所有檔案的屬性表處理程式,您可以在 PropertySheetHandlers 子機碼下註冊。
HKEY_CLASSES_ROOT
*
shellex
PropertySheetHandlers
下表列出 HKEY_CLASSES_ROOT 的各種子機碼,在這些子機碼下可以註冊擴充處理程式。 請注意,許多擴充處理程式無法在所有列出的子機碼下註冊。 如需進一步的詳細資訊,請參閱特定處理程序的文件。
子金鑰 | 描述 | 可能的處理者 |
---|---|---|
* | 所有檔案 | 快捷選單、屬性表、動詞(請參閱下方) |
所有檔案系統物件 | 所有檔案和檔案資料夾 | 捷徑選單、屬性頁、指令 |
資料夾 | 所有資料夾 | 快捷選單、屬性頁、動詞 |
目錄 | 資料夾 | 快捷功能表、屬性表、動詞 |
Directory\Background | 檔案資料夾背景 | 只有捷徑選單 |
桌面背景 | 桌面背景 (Windows 7 和更新版本) | 快捷選單、動詞 |
磁碟驅動器 | MyComputer 中的所有磁碟驅動器,例如 “C:\” | 快捷功能表、屬性表、動詞 |
網路 | 整個網路 (我的網路位置下) | 快捷功能表、屬性表、動詞 |
Network\Type\# | 下述類型 # 的所有物件(請參閱下方) | 快捷功能表、屬性表、動詞 |
NetShare | 所有網路共用 | 快捷功能表、屬性表、動詞 |
NetServer | 所有網路伺服器 | 快捷功能表、屬性表、動詞 |
network_provider_name | 網路提供者 「network_provider_name」 提供的所有物件 | 捷徑選單、屬性頁、指令 |
印表機 | 所有印表機 | 快捷選單、屬性頁 |
AudioCD | CD 磁碟驅動器中的音訊CD | 僅限動詞 |
DVD | DVD 光驱 (Windows 2000) | 快捷功能表、屬性表、命令 |
筆記
- 檔案資料夾的背景快捷選單是透過在資料夾內空白處按滑鼠右鍵來開啟,而不是點擊資料夾中任何內容。
- “Verbs” 是 HKEY_CLASSES_ROOT\子機碼下註冊的特殊命令,\Shell\Verb。
- 對於 網路\類型\#,“#” 是十進位中的網络提供者類型代碼。 網路提供者類型代碼是網路類型的高位字。 Winnetwk.h 頭檔 (WNNC_NET_* 值) 中會提供網路類型清單。 例如,WNNC_NET_SHIVA是0x00330000,因此對應的類型子機碼會 HKEY_CLASSES_ROOT\Network\Type\51。
- “network_provider_name” 是由 WNetGetProviderName所指定的網络提供者名稱,空格轉換成底線。 例如,如果已安裝 Microsoft 網路服務提供者,其提供者名稱為「Microsoft Windows Network」,而對應的 network_provider_name 為 Microsoft_Windows_Network。
延伸模組處理程式註冊的範例
若要啟用特定的處理程式,請在擴充功能處理程式類型的子機碼下,使用該處理程式的名稱建立一個子機碼。 Shell 不會使用處理程式的名稱,但它必須與該類型子機碼下所有其他名稱不同。 將名稱子機碼的預設值設定為處理程式 GUID 的字串形式。
下列範例說明啟用捷徑功能表和屬性面板擴充處理程式時的註冊表項,使用一個 .myp 檔案類型作為範例。
HKEY_CLASSES_ROOT
.myp
(Default) = MyProgram.1
CLSID
{00000000-1111-2222-3333-444444444444}
InProcServer32
(Default) = C:\MyDir\MyCommand.dll
ThreadingModel = Apartment
{11111111-2222-3333-4444-555555555555}
InProcServer32
(Default) = C:\MyDir\MyPropSheet.dll
ThreadingModel = Apartment
MyProgram.1
(Default) = MyProgram Application
Shellex
ContextMenuHandler
MyCommand
(Default) = {00000000-1111-2222-3333-444444444444}
PropertySheetHandlers
MyPropSheet
(Default) = {11111111-2222-3333-4444-555555555555}
相關主題