我正在尝试提取与常见文件类型(例如 PDF 文件、DOCX、XLSX 等)关联的五种格式(大小)的图标。
我在 StackOverflow 和其他地方翻阅了无数帖子;所有这些都解释了提取关联图标的各种技术,并且每种技术都有其局限性。 (示例)
对于库存图标(例如文件夹),提取所有图像格式的最佳方法是使用
SHGetStockIconInfo
函数获取库存图标的文件位置和图标索引,然后通过调用 SHDefExtractIcon
我可以提取所需的图标大小.
对于常见的文件类型,我尝试了各种技术。大多数 Win32 函数仅限于两种图像格式:小 (16x16) 和大 (32x32)。我确信在 Windows11 中,几乎所有标准图标都具有 24x24 和 64x64 等图像格式。一些互联网帖子解释了使用
SHGetFileInfo
来标识包含该图标的文件路径;这似乎不适用于 Windows11 和 .NET Framework 4.8。
我用来获取更多图标大小的方法是使用
SHGetFileInfo
和 SHGFI_SYSICONINDEX
和 SHGFI_USEFILEATTRIBUTES
标志,然后使用 SHGetImageList
来提取各种图标大小。但即使这种技术也仅限于以下图标尺寸:16x16、32x32、48x48 和 128x128。我尝试手动调整更高图像分辨率的大小以实现 24x24 和 64x64,但结果会导致图像稍微模糊。
这里图标16,32和48是通过原生shell函数直接提取的;而24是从32调整大小,64是从128调整大小;看起来很模糊。
我的问题是:我确信Windows11系统中可用的常见图标在图标库文件中内置了24x24和64x64图像格式;我如何提取这些图标?如果能够提取与文件扩展名(该文件不需要存在)相关的图标,其大小为 16、24、32、48 和 64,那就太好了。
我没有依赖 Win32 shell 函数,而是通过注册表跟踪文件类型的默认图标,然后提取所需的图标大小。
看到区别,第一行由使用 shell 函数提取的图像组成,其中 24x24(第二个图标)和 64x64 图标(最后一个图标)是模糊的,因为即使图标存在,shell 函数也不支持此图标大小。
第二行是我修改后的过程,其中涉及从注册表中读取默认图标(参见此)以识别包含该图标及其图标索引的 EXE 或 DLL,然后使用各种图标大小调用
SHDefExtractIcon
来提取正确的图标图标图像。目前效果很好,将在沙箱系统上尝试一下,看看它是否可以在那里工作。