我正在实现名称空间扩展,它代表服务器上的远程文件系统,我想让图标叠加显示文件状态(已锁定),如下所示:icon overlay handlers for namespace extension
那个问题已在那里得到解答,我按照建议完成了所有事情:
使用实现的IShellIconOverlayIdentifier接口创建了额外的shell扩展: 在IShellIconOverlayIdentifier.GetOverlayInfo中,我返回图标文件和图标索引。 在IShellIconOverlayIdentifier.IsMemberOf中,我返回S_FALSE以不显示系统中任何其他文件的叠加层。
在主要的NSE中,我实现了IShellIconOverlay接口,并使用SHGetIconOverlayIndex函数从系统图像列表中检索我的图标叠加。
问题是:SHGetIconOverlayIndex总是返回-1。
但是!如果我返回S_OK作为IShellIconOverlayIdentifier.IsMemberOf的结果 - SHGetIconOverlayIndex立即开始提供正确的叠加索引!但当然在这种情况下,我的叠加层会添加到系统中的所有文件中,包括我的NSE。
有趣的是,如果我在IShellIconOverlayIdentifier.IsMemberOf的后续调用中返回S_FALSE - SHGetIconOverlayIndex仍然提供正确的叠加索引,那么一切都很好:我的NSE中只覆盖了...
我做错了什么以及如何从一开始就得到这个结果?可能是缓存问题?..
(对不起,我不能把这个写成提问的评论,因为我没有足够的声誉......)
答案 0 :(得分:1)
看起来你遇到的问题没有正确的解决方案。也许我错了,但我认为Windows使用以下规则:
1)在开始shell时,覆盖图标列表仅包含默认覆盖图标(4个图标,在下一版本的Windows中,此值可能更大)。
2)当任何叠加图标处理程序在IShellIconOverlayIdentifier.IsMemberOf调用中返回S_OK时,shell会将其图标添加到叠加图标列表。
3)shell图标列表中叠加图标的最大数量为15(默认值为4,外部为11)。
4)因此,只有11个返回S_OK的第一个图标处理程序将被添加到shell图标列表中。其他人将被忽视。
因此,即使您将注册表项重命名为000,其他图标处理程序也可能会在您的处理程序之前返回S_OK。
所以我建议使用覆盖图像为NSE对象创建完整图标。