如何实现图标覆盖处理程序

图标覆盖处理程序是作为 DLL 实现的进程内组件对象模型 (COM) 对象。 除了 IUnknown 之外,还导出一个接口: IShellIconOverlayIdentifier。 此接口有三种方法: IShellIconOverlayIdentifier::GetOverlayInfoIShellIconOverlayIdentifier::GetPriorityIShellIconOverlayIdentifier::IsMemberOf

Instructions

步骤 1:实现 GetOverlayInfo

在初始化期间首先调用 GetOverlayInfo 方法。 方法返回包含图标覆盖图像的文件的完全限定路径,以及该文件中从零开始的索引。 然后,Shell 会将映像添加到系统映像列表。 图标覆盖可以包含在任何标准文件类型中,包括 .exe、.dll 和 .ico。

初始化完成后,Shell 会在需要显示处理程序的图标覆盖时调用 GetOverlayInfo 。 方法应返回与初始化期间相同的文件名和索引。 尽管 Shell 使用在系统映像列表中缓存的图像,而不是从文件加载图像,但图标覆盖仍由其文件名和索引标识。

步骤 2:实现 GetPriority

仅在初始化期间调用 GetPriority 方法。 它将优先级值分配给处理程序的图标覆盖。 该值的范围可以是 0 到 100,其中 100 是最低优先级。 此优先级值的用途是帮助 Shell 解决为单个对象指定多个图标覆盖时出现的冲突。 Shell 首先使用一组内部规则来确定优先级最高的图标覆盖。 如果这些规则不能解决冲突,则 由 GetPriority 分配给图标覆盖层的值确定优先级。

GetPriority 设置的优先级值不是解决不相关的图标覆盖处理程序之间冲突的可靠方法。 处理程序无法确定其他处理程序使用的优先级值。 通常,应将值设置为零。 但是,如果已实现两个或多个图标覆盖处理程序,这些处理程序可以请求同一对象的图标覆盖图标,则优先级值非常有用。 通过适当设置优先级值,可以指定将显示哪个请求的图标覆盖。

步骤 3:实现 IsMemberOf

Shell 调用 IsMemberOf 方法以确定它是否应显示特定对象的处理程序图标覆盖。 Shell 通过将对象的名称传递给 方法来指定对象。 如果处理程序希望显示其图标覆盖, IsMemberOf 将返回S_OK。 如果没有,则返回S_FALSE。

图标覆盖处理程序通常用于处理一组特定的文件。 典型的示例是 文件类型,由特定的文件扩展名标识。 图标覆盖处理程序可以请求该文件类型的所有文件的图标覆盖。 仅当文件类型的文件处于特定状态时,某些处理程序才请求图标覆盖。 但是,图标覆盖处理程序可以自由地为其选择的任何对象请求其图标覆盖。