【问题标题】:icon overlay handlers for namespace extension命名空间扩展的图标覆盖处理程序
【发布时间】:2014-01-25 08:59:31
【问题描述】:
我正在开发命名空间扩展,它提供服务器上文件的虚拟视图。在这个视图中,我需要使用覆盖图标提供文件的不同状态(使用中、离线、不同步等)。
我阅读了实现覆盖处理程序的文章,并认为我会尝试在我们的一个覆盖处理程序中处理这个问题,它实现了 IShellIconOverlayIdentifier 接口。
我看到 IShellIconOverlayIdentifier::IsMemberOf() 和其他函数仅在我访问普通文件系统上的文件时调用,即 c:\、d:\ 等。当我浏览命名空间扩展时,这些调用不会被调用一点也不。这是为什么?如何为命名空间扩展中的对象实现覆盖?
问候,
马杜
【问题讨论】:
标签:
windows
com
atl
windows-shell
shell-extensions
【解决方案1】:
添加覆盖图标的唯一方法是在您的 NSE 中实现 IShellIconOverlay。但问题是 IShellIconOverlay.GetOverlayIndex 和 IShellIconOverlay.GetOverlayIconIndex 必须返回从 SHELL 图像列表接收的图标。可以使用 SHGetIconOverlayIndex 函数接收来自 shell 图像列表的叠加图标。并且有 NO 方法可以将额外的叠加图标添加到 shell 图像列表中。
如果你想使用标准的覆盖图标,如链接或共享图标,只需使用 SHGetIconOverlayIndex。但是如果你想使用自定义图标,你必须使用“hack”。 Hack 是简单的附加覆盖外壳扩展。只有覆盖外壳扩展可以在外壳图像列表中添加额外的覆盖图标。在 IShellIconOverlayIdentifier.GetOverlayInfo 中,您将返回您的图标和索引,IShellIconOverlayIdentifier.IsMemberOf 将始终返回 S_FALSE。在 IShellIconOverlay_GetOverlayIndex 的 NSE 中,您将使用您的图标和索引调用 SHGetIconOverlayIndex。
您必须为每个图标使用单独的覆盖外壳扩展。但不要忘记,Windows 对系统中注册的覆盖外壳扩展的最大计数有限制。我不记得确切的数字,但大约是 15。