我正在开发命名空间扩展,它提供服务器上文件的虚拟 View 。在此 View 中,我需要使用叠加图标提供文件的不同状态(使用中、离线、不同步等)。
我阅读了实现覆盖处理程序的文章,并认为我会尝试在我们的一个覆盖处理程序中处理这个问题,它实现了 IShellIconOverlayIdentifier 接口(interface)。
我看到 IShellIconOverlayIdentifier::IsMemberOf() 和其他函数仅在我访问普通文件系统上的文件时被调用,即 c:\、d:\等。当我浏览命名空间扩展时,这些调用不会被调用根本。这是为什么?如何为命名空间扩展中的对象实现覆盖?
问候, 马杜
最佳答案
添加覆盖图标的唯一方法是实现 IShellIconOverlay在你的 NSE 中。但问题是 IShellIconOverlay.GetOverlayIndex 和 IShellIconOverlay.GetOverlayIconIndex 必须返回从 SHELL 图像列表收到的图标。可以使用 SHGetIconOverlayIndex 函数接收来自外壳图像列表的叠加图标。并且没有方法可以将额外的覆盖图标添加到 shell 图像列表中。
如果您想使用标准的覆盖图标,如链接或共享图标,只需使用 SHGetIconOverlayIndex。但是如果你想使用自定义图标,你必须使用“hack”。 Hack 是简单的附加覆盖外壳扩展。只有覆盖外壳扩展可以将额外的覆盖图标添加到外壳图像列表中。在 IShellIconOverlayIdentifier.GetOverlayInfo 中,您将返回您的图标和索引,IShellIconOverlayIdentifier.IsMemberOf 将始终返回 S_FALSE。在 IShellIconOverlay_GetOverlayIndex 的 NSE 内部,您将使用您的图标和索引调用 SHGetIconOverlayIndex。
您必须为每个图标使用单独的覆盖外壳扩展。但不要忘记 Windows 对系统中注册的覆盖外壳扩展的最大数量有限制。我不记得确切的数字,但大约是 15。
关于windows - namespace 扩展的图标覆盖处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20975679/