我需要以编程方式找到Windows可执行文件的默认图标(PE文件= dll,exe,com ..)。我知道如何遍历资源并确定什么是图标,什么是光标等,但据我所知,没有任何图标以任何方式标记为默认图标。那么,有人知道,如何找到默认图标?而且,我不想使用任何windows api调用,我想自己编写函数。问题是我不知道所有图标中哪一个是默认图标。
答案 0 :(得分:6)
经过大量搜索,我发现默认图标不是id最低的图标。
Windows使用多种尺寸的图标来处理各种事物。有关详细信息,请look here,但简而言之此处是重要信息:
当系统显示图标时,它必须从.exe或.dll文件中提取相应的图标图像。系统使用以下步骤选择图标图像:
选择RT_GROUP_ICON资源。 如果不止一个这样的资源 存在,系统使用第一个 资源中列出的资源 凭证。
选择适当的RT_ICON图像 来自RT_GROUP_ICON资源。如果 存在多个图像, 系统使用以下标准 选择图像:
尺寸最接近的图像 请求的大小被选中。
如果是那个尺寸的两个或更多图像 存在,匹配的 选择显示器的颜色深度。
如果没有图像与颜色完全匹配 显示深度,图像用 最大的颜色深度 不超过的颜色深度 选择显示。如果全部超过了 颜色深度,最低的一个 选择颜色深度。
注意:系统会将8个或更多bpp的所有颜色深度视为相等。因此,在同一资源中包含16x16 256色图像和16x16 16色图像没有任何优势 - 系统将只选择遇到的第一个图像。当显示器处于8-bpp模式时,系统将在256色图标上选择16色图标,并使用系统默认调色板显示所有图标。
由于请求的大小为16x16(因为这是系统小图标大小,即默认图标大小),我想我们可以说默认图标是第一个图标组中具有最小尺寸的图标(没有比16x16更小的图标),颜色深度最高。
编辑:一个小小的修正。大小小于16x16的图标可能显然位于资源中,但这表示该文件没有默认图标,然后系统会提供自己的图标。答案 1 :(得分:3)
您找到的第一个是默认值。
默认图标只是id最低的图标,因此,根据定义,它是枚举资源时发现的第一个图标。