命名空间扩展的自定义图标覆盖

Custom icon overlays for namespace extension

我正在实现代表服务器上远程文件系统的命名空间扩展,我希望图标覆盖显示文件状态(锁定),就像这里的另一个问题一样:icon overlay handlers for namespace extension

这个问题已经在那里回答了,我已经按照建议做了所有事情:

  1. 创建了额外的 shell 扩展,实现了 IShellIconOverlayIdentifier 接口: 在IShellIconOverlayIdentifier.GetOverlayInfo我return图标文件和图标索引。 在 IShellIconOverlayIdentifier.IsMemberOf 我 return S_FALSE 不显示我对系统中任何其他文件的覆盖。

  2. 在主 NSE 中,我实现了 IShellIconOverlay 接口,并使用 SHGetIconOverlayIndex 函数从系统图像列表中检索我的图标覆盖。

问题是:SHGetIconOverlayIndex 总是 returns -1.

但是!如果我 return S_OK 作为 IShellIconOverlayIdentifier.IsMemberOf 的结果 - SHGetIconOverlayIndex 立即开始给出正确的覆盖索引!但当然在这种情况下,我的叠加层会添加到系统中的所有文件中,包括我的 NSE。

有趣的是,如果我 return S_FALSE 在 IShellIconOverlayIdentifier.IsMemberOf 的后续调用中 - SHGetIconOverlayIndex 仍然提供正确的覆盖索引,一切都会变得很好:我有覆盖只有我的 NSE...

我做错了什么以及如何从一开始就得到这个结果?可能是缓存问题?..

(抱歉,我无法将此写为对被提及问题的评论,因为我没有足够的声誉...)

看来您遇到的问题没有正确的解决方法。也许我错了,但我认为 Windows 使用以下规则工作:

1) 一开始 shell 有覆盖图标列表,仅包含默认覆盖图标(4 个图标,在下一版本 Windows 中,此值可以更大)。

2) 当任何覆盖图标处理程序 return S_OK 在调用 IShellIconOverlayIdentifier.IsMemberOf shell 时将其图标添加到覆盖图标列表中。

3) shell 图标列表中叠加图标的最大数量为 15(4 个默认 + 11 个外部)。

4) 因此只有 11 个第一个图标处理程序 returning S_OK 将被添加到 shell 图标列表。其他将被忽略。

因此,即使您将注册表项重命名为 000,其他图标处理程序也可能 return S_OK 在您的处理程序之前。

所以我的建议是为您的 NSE 对象创建带有覆盖图像的完整图标。