【问题标题】:Use OverlayIdentifiers icons in namespace extension在命名空间扩展中使用 OverlayIdentifiers 图标
【发布时间】:2013-12-08 15:19:33
【问题描述】:

我为 Windows 资源管理器开发命名空间扩展。 在我的扩展中,我使用覆盖图标,我实现了界面: IShellIconOverlay

int GetOverlayIndex(IntPtr pidl, out int iconIndex);
int GetOverlayIconIndex(IntPtr pidl, out int iconIndex);

在该函数中,我使用函数 SHGetIconOverlayIndex 从 dll 位置和索引获取图像列表中的图标覆盖索引。

我的问题是,我使用的另一个扩展程序的覆盖标识符注册表列表中已经有图标,并且我想将覆盖图标扩展程序中的相同图标用于命名空间扩展程序。 目前 SHGetIconOverlayIndex 函数在图像列表中创建新槽,众所周知,窗口有 14-15 个叠加图标的限制。

那么我怎样才能在这两个扩展之间回收我的图标呢?

【问题讨论】:

    标签: c# c++ shell windows-explorer


    【解决方案1】:

    如果“SHGetIconOverlayIndex”函数为您提供有限的系统图像列表,为什么不使用“LoadLibrary”->“FindResource”或“ExtractIcon”从 Overlay 图标扩展的资源中加载图标。您可以在命名空间扩展中创建自己的图像列表,并使用“ImageList_SetOverlayImage”将叠加图像添加到此图像列表中。

    【讨论】:

    • 我已经尝试过那个解决方案,它太慢了。并且资源管理器总是为图标保存缓存,所以它并不总是调用 Extract 方法,即使我告诉他不要使用缓存。我唯一的解决方案是清除资源管理器的图标缓存。但这是一个肮脏的解决方案
    • 它很慢 --> 如果你必须从 DLL 文件的资源中获取图标,无论你使用什么函数,你都必须先将它映射到内存中。如果有很多图标,首先 LoadLibrary 然后使用 FindResource 和 FindIcon 函数。文档没有说 ExtractIcon 函数被缓存。
    【解决方案2】:

    MSDN 谈到 SHGetIconOverlayIndex:

    注意图片在初始化过程中加载到系统映像列表后,无法更改。 pszIconPath 和 iIconIndex 指定的文件名和索引仅用于标识图标覆盖。 SHGetIconOverlayIndex 不能用于修改系统镜像列表

    所以只需将文件名和索引传递给 SHGetIconOverlayIndex。窗口不会创建新插槽,而是使用已由覆盖图标处理程序创建的插槽。

    【讨论】:

      猜你喜欢
      • 2011-06-28
      • 1970-01-01
      • 2011-12-05
      • 2015-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-25
      相关资源
      最近更新 更多