4

我需要以编程方式找到 Windows 可执行文件(PE 文件 = dll、exe、com..)的默认图标。我确实知道如何浏览资源并确定什么是图标、什么是光标等,但据我所知,没有任何图标以任何方式标记为默认图标。那么,有人知道如何找到默认图标吗?此外,我不想使用任何 windows api 调用,我想自己编写函数。问题是我不知道所有图标中的哪一个是默认图标。

4

2 回答 2

7

经过大量搜索,我发现默认图标不是ID最低的那个。

Windows 使用多种尺寸的一个图标来处理各种事情。有关更多信息,请查看此处,但简而言之,这里是重要信息:


当系统显示图标时,它必须从 .exe 或 .dll 文件中提取适当的图标图像。系统使用以下步骤选择图标图像:

  1. 选择 RT_GROUP_ICON 资源。如果存在多个这样的资源,系统将使用资源脚本中列出的第一个资源。

    • 从 RT_GROUP_ICON 资源中选择适当的 RT_ICON 图像。如果存在多个图像,系统将使用以下标准来选择图像:

    • 选择尺寸最接近请求尺寸的图像。

    • 如果存在两个或多个该尺寸的图像,则选择与显示器颜色深度匹配的图像。

    • 如果没有图像与显示器的颜色深度完全匹配,则选择具有最大颜色深度且不超过显示器颜色深度的图像。如果都超过颜色深度,则选择颜色深度最低的那个。

注意:系统将所有 8 或更高 bpp 的颜色深度视为相同。因此,在同一资源中包含 16x16 256 色图像和 16x16 16 色图像没有任何优势——系统只会选择它遇到的第一个。当显示为 8-bpp 模式时,系统将选择 16 色图标而不是 256 色图标,并将使用系统默认调色板显示所有图标。


由于请求的大小是 16x16(因为这是系统小图标大小,即默认图标大小),我认为我们可以说默认图标是第一个图标组中具有最小大小的图标(不小于 16x16 的图标可以存在)具有最高的颜色深度。

编辑:一个小的修正。小于 16x16 的图标显然可能在资源中,但这表明该文件没有默认图标,然后系统会提供自己的图标。

于 2010-07-17T09:50:42.750 回答
4

您找到的第一个是默认的。

默认图标只是具有最低 id 的图标,因此,根据定义,它是枚举资源时发现的第一个图标。

于 2010-07-17T08:52:00.807 回答