返回
从 Windows 文件中提取叠加图标:揭秘自动化测试的神兵利器
windows
2024-03-17 09:02:08
从 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 及更高版本。