注册 Shell 扩展处理程序

必须先注册 Shell 扩展处理程序对象,然后 Shell 才能使用它。 本主题是有关如何注册 Shell 扩展处理程序的一般讨论。

每当创建或更改 Shell 扩展处理程序时,请务必通知系统已进行更改。 为此,请调用 SHChangeNotify,指定 SHCNE_ASSOCCHANGED 事件。 如果不调用 SHChangeNotify,则在重新启动系统之前,可能无法识别更改。

Windows 2000 系统还有其他一些因素。 有关详细信息,请参阅 Windows 2000 Systems 上的注册 Shell 扩展处理程序部分。

与所有组件对象模型(COM)对象一样,必须使用随Windows软件开发工具包(SDK)提供的 Guidgen.exe等工具为处理程序创建 GUID。 在 HKEY_CLASSES_ROOT\CLSID 下创建一个子项,其名称为该 GUID 的字符串表示形式。 由于 Shell 扩展处理程序是进程内服务器,因此还必须在该 GUID 子项下创建一个 InprocServer32 子项,并将(Default)值设置为该处理程序 DLL 的路径。 使用单元线程模型。 下面显示了一个示例:

HKEY_CLASSES_ROOT
   CLSID
      {00021500-0000-0000-C000-000000000046}
         InprocServer32
            (Default) = %windir%\System32\Example.dll
            ThreadingModel = Apartment

Important

对于 shell 扩展处理程序,ThreadingModel 必须为 Apartment Shell 的文件夹视图和资源管理器在单线程单元 (STA) 线程上运行。 使用 FreeBoth 线程模型可能会导致间歇性故障、死锁或难以诊断的崩溃。

对于打包的桌面应用(MSIX),应优先使用 desktop4:Extension 元素进行基于清单的注册,而不是直接写入注册表项。 这可确保正确的包标识和干净卸载。

每当 Shell 采取某项可能调用 Shell 扩展处理程序的操作时,就会检查相应的注册表子项。 注册扩展处理程序时使用的子项将决定其调用时机。 例如,当 Shell 显示 文件类型成员的快捷菜单时调用快捷菜单处理程序是一种常见做法。 在这种情况下,必须将处理程序注册到文件类型的 ProgID 子键下。

本主题讨论以下主题:

处理程序名称

若要启用 Shell 扩展处理程序,请在 ProgID(用于文件类型)或 Shell 对象类型名称(用于 predefined_shell_objects)的 ShellEx 子键下,使用处理程序子键名称(见下文)创建一个子键。

例如,如果要为 MyProgram.1 注册快捷菜单扩展处理程序,请先创建以下子键:

HKEY_CLASSES_ROOT
   MyProgram.1
      ShellEx
         ContextMenuHandlers

对于以下处理程序,请在 Shell 扩展的“处理程序子项名称”子项下创建一个子项,该子项名为类标识符 (CLSID) 的字符串版本。 在处理程序子项名称下,可以通过创建多个子项来注册多个扩展。

处理程序 Interface 处理程序子项名称
列提供程序处理程序 IColumnProvider ColumnHandlers
快捷菜单处理程序 IContextMenu ContextMenuHandlers
Copyhook 处理程序 ICopyHook CopyHookHandlers
拖放处理程序 IContextMenu DragDropHandlers
属性表处理程序 IShellPropSheetExt PropertySheetHandlers

 

对于以下处理程序,“处理程序子项名称”键的默认值是 Shell 扩展的 CLSID 的字符串版本。 只能为这些处理程序注册一个扩展。

处理程序 Interface 处理程序子项名称
数据处理者 IDataObject DataHandler
拖放处理程序 IDropTarget DropHandler
图标处理程序 IExtractIconA/W IconHandler
缩略图图像处理程序 IThumbnailProvider {E357FCCD-A995-4576-B01F-234630154E96}
信息提示处理程序 IQueryInfo {00021500-0000-0000-C000-0000000000046}
Shell 链接 (ANSI) IShellLinkA {000214EE-0000-0000-C000-0000000000046}
外壳链接(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 下可用于注册扩展处理程序的各个子项。 请注意,许多扩展处理程序不能在所有列出的子项下注册。 有关更多详细信息,请参阅特定处理程序的文档。

子项 Description 可能的处理程序
* 所有文件 快捷菜单、属性表、谓词(请参阅下文)
AllFileSystemObjects 所有文件和文件夹 快捷菜单、属性表、谓词
Folder 所有文件夹 快捷菜单、属性表、谓词
Directory 文件夹 快捷菜单、属性表、谓词
Directory\Background 文件文件夹背景 仅限快捷菜单
DesktopBackground 桌面背景(Windows 7及更高) 快捷菜单,谓词
Drive MyComputer 中的所有驱动器,例如“C:\” 快捷菜单、属性表、谓词
Network 整个网络(在“我的网络位置”下) 快捷菜单、属性表、谓词
Network\Type\# 类型为 #的所有对象(请参阅下文) 快捷菜单、属性表、谓词
NetShare 所有网络共享 快捷菜单、属性表、谓词
NetServer 所有网络服务器 快捷菜单、属性表、谓词
network_provider_name 网络提供程序“network_provider_name”提供的所有对象 快捷菜单、属性表、谓词
Printers 所有打印机 快捷菜单,属性表
AudioCD CD 驱动器中的音频光盘 仅动词
Dvd DVD 驱动器 (Windows 2000) 快捷菜单、属性表、谓词

 

备注

  • 通过在文件夹中单击鼠标右键(而不是在任何文件夹内容上单击鼠标右键)可以访问文件夹背景快捷菜单。
  • “Verbs”是注册在 HKEY_CLASSES_ROOT\Subkey\Shell\Verb 下的特殊命令。
  • 对于 网络\类型\#,“#”是十进制中的网络提供程序类型代码。 网络提供程序类型代码是网络类型的高位字。 Winnetwk.h 头文件中提供了网络类型列表(WNNC_NET_* 值)。 例如,WNNC_NET_SHIVA 为 0x00330000,因此相应的类型子项为 HKEY_CLASSES_ROOT\Network\Type\51
  • network_provider_name”是由 WNetGetProviderName 指定的网络提供程序名称,其中空格转换为下划线。 例如,如果安装了 Microsoft Networking 网络提供程序,则其提供程序名称为“Microsoft Windows Network”,相应的 network_provider_nameMicrosoft_Windows_Network

扩展处理程序注册示例

若要启用特定处理程序,请在扩展处理程序类型子项下创建一个以该处理程序名称命名的子项。 Shell 不使用处理程序的名称,但它必须与该类型子项下的所有其他名称不同。 将 name 子键的默认值设置为处理程序的 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}

初始化 Shell 扩展处理程序