返回

从 Windows 文件中提取叠加图标:揭秘自动化测试的神兵利器

windows

从 Windows 文件中提取叠加图标:终极指南

前言

对于自动化测试,检查文件图标叠加是否正确显示至关重要。本文将深入探讨如何从 Windows 文件中提取叠加图标本身或其路径,以便进行比较和测试。

SHGetFileInfo 方法:一个死胡同

传统上,SHGetFileInfo 方法被用于检索文件图标和信息。然而,令人失望的是,该方法始终将叠加图标索引返回为 0,使得它在这个场景中毫无用武之地。

SHGetImageList 和 ImageList_GetIcon 方法:解谜之道

通过巧妙地组合 SHGetImageList 和 ImageList_GetIcon 方法,我们可以绕过 SHGetFileInfo 的限制。SHGetImageList 返回系统图像列表,其中包含所有叠加图标。ImageList_GetIcon 则可以从该列表中提取特定索引的叠加图标。

代码示例:步步解析

private static Icon GetOverlay(string filePath)
{
    var imageListGuid = new Guid("46EB5926-582E-4017-9FDF-E8998DAA0950");
    IMAGELIST sysImageList;
    var result = SHGetImageList(SHIL_SMALL, ref imageListGuid, out sysImageList);

    if (result == 0)
    {
        var shfi = new SHFILEINFO();
        var hSuccess = SHGetFileInfo(filePath, 0, ref shfi, (uint)Marshal.SizeOf(shfi), SHGFI_ICON | SHGFI_OVERLAYINDEX | SHGFI_SMALLICON);

        if (hSuccess != IntPtr.Zero)
        {
            var iconIndex = shfi.iIcon;
            var overlayIndex = iconIndex & 0xF;

            var hOverlayIcon = ImageList_GetIcon(sysImageList.handle, overlayIndex, 0);
            var overlay = Icon.FromHandle(hOverlayIcon);

            return overlay;
        }
    }

    return null;
}

注意事项:避免陷阱

  • 确保包含对 System.Drawing.dll 的引用。
  • 叠加图标不存在时,方法将返回 null。
  • 释放 ImageList_GetIcon 返回的图标句柄,以避免内存泄漏。

结论:赋能自动化

通过掌握 SHGetImageList 和 ImageList_GetIcon 方法,我们可以从 Windows 文件中提取叠加图标,为自动化测试和文件管理打开新的可能性。

常见问题解答

Q1:为什么 SHGetFileInfo 无法提取叠加图标索引?

A1:这是 SHGetFileInfo 方法的一个已知限制,无论叠加图标如何,它始终返回 0。

Q2:如何确保获取正确的叠加图标?

A2:使用 SHGetFileInfo 获得文件图标索引,然后从图标索引中提取叠加图标索引。

Q3:ImageList_GetIcon 返回的图标需要释放吗?

A3:是的,使用 DestroyIcon 函数释放图标句柄非常重要。

Q4:如果文件没有叠加图标怎么办?

A4:GetOverlay 方法将返回 null,表示不存在叠加图标。

Q5:这种方法适用于 Windows 的所有版本吗?

A5:该方法适用于 Windows Vista 及更高版本。