使用 Shell 扩展

可以使用注册表项和 .ini 文件扩展 Shell 的功能。 虽然扩展 Shell 的方法很简单,并且足以满足许多目的,但它是有限的。 例如,如果使用注册表为文件类型指定自定义图标,该类型的每个文件将显示相同的图标。 如果使用注册表扩展 Shell,则不允许你改变文件类型的不同成员的图标。 Shell 的其他方面(例如,右键单击文件时可以显示的 Properties 属性表)不能使用注册表完全修改。

扩展 Shell 的更强大且更灵活的方法是实现 shell 扩展处理程序。 这些处理程序可以针对 Shell 可以采取的各种操作来实现。 在执行操作之前,Shell 会查询扩展处理程序,从而有机会修改该操作。 常见示例是快捷菜单扩展处理程序。 如果为文件类型实现了某个功能,则每次右键单击其中一个文件时都会查询它。 然后,处理程序可以逐个文件指定其他菜单项,而不是为该文件类型的所有文件设置相同。

这组主题讨论如何实现扩展处理程序,以便修改各种 Shell 操作。 以下处理程序与特定文件类型相关联,并允许逐个文件指定。

处理程序 Description
快捷菜单处理程序 在显示文件的快捷菜单之前调用。 它可让您按单个文件将项目添加到快捷方式菜单中。
数据处理者 在 Shell 对象上执行拖放操作时调用。 它使你能够向拖放目标提供附加的剪贴板格式。
拖放处理程序 当数据对象被拖到文件上方或放置到文件上时调用。 它可让你将文件设为拖放目标。
图标处理程序 在显示文件图标之前调用。 它使你可以根据文件将文件的默认图标替换为自定义图标。
属性表处理程序 在显示对象的 Properties 属性表之前调用。 它使你可以添加或替换页面。
缩略图图像处理程序 提供表示项的图像。
信息提示处理程序 当用户将鼠标指针悬停在对象上时提供弹出文本。
元数据处理程序 提供对存储在文件中的元数据(属性)的读取和写入访问权限。 这可用于扩展详细信息视图、信息提示、属性页和分组功能。

 

其他项不与特定文件类型关联,但在某些 Shell 操作之前调用。

处理程序 Description
列处理程序 在 Windows 资源管理器显示文件夹的“详细信息”视图之前调用。 它使你可以向“详细信息”视图添加自定义列。
复制钩子处理程序 当即将移动、复制、删除或重命名文件夹或打印机对象时调用。 它使你能够批准或否决该操作。
拖放处理程序 使用鼠标右键拖动文件时调用。 它使你能够修改显示的快捷菜单。
图标覆盖处理程序 在显示文件图标之前调用。 它使你可以为文件的图标指定覆盖。
搜索处理程序 调用以启动搜索引擎。 它使你能够实现可从“开始”菜单或Windows资源管理器访问的自定义搜索引擎。

 

上面列出的部分介绍了如何实现特定扩展处理程序的详细信息。 有关所有 Shell 扩展处理程序通用的实现问题的讨论,请参阅以下主题:

注释

安全性和稳定性注意事项: Shell 扩展处理程序属于进程内 COM DLL,会直接加载到资源管理器进程中(或任何承载 Shell 的进程中)。 你的扩展中的崩溃或挂起将导致所有用户的资源管理器崩溃或挂起。

关键要求:

  • 使用 ThreadingModel = Apartment 注册 — 资源管理器的 Shell 视图在 STA 线程上运行。 使用 FreeBoth 可能导致细微的线程错误。
  • 正确处理 DPI 感知 — 资源管理器是每个监视器 DPI 感知的。 假设 DPI 固定的扩展在多显示器配置下会渲染异常。
  • 对于已打包的(MSIX)应用,请通过 desktop4:Extension 元素或稀疏包进行基于清单的注册,而不要直接写入注册表项。
  • 在实现完整的 COM Shell 扩展之前,请先考虑是否可以通过更简单的方法来满足你的需求(例如静态动词注册、.reg文件关联,或 Windows.Storage.Provider API)。