在可执行文件的资源中,如何找到默认图标?

2024-02-20

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


经过一番搜索,我发现默认图标并不是 id 最小的图标。

Windows 使用同一个图标的多种尺寸来表示不同的内容。了解更多信息,看这里 http://msdn.microsoft.com/en-us/library/ms648050%28VS.85%29.aspx,但简而言之这是重要信息:


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

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

    • 选择合适的RT_ICON图像 来自 RT_GROUP_ICON 资源。如果 存在不止一张图像, 系统使用以下标准 选择图像:

    • 尺寸最接近的图像 选择所需的尺寸。

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

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

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


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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在可执行文件的资源中,如何找到默认图标? 的相关文章

  • MigraDoc 项目符号列表(漏洞)

    在我的解决方案中 我在 PDF 文件中使用项目符号列表 它看起来像这样 Solcellepaneler kr ver hverken autoriseret service eller tidskr vende vedligehold So
  • 如何从 webmethod 向 AJAX 调用返回异常?

    我回来了List
  • Debug.WriteLine() 未命中

    我正在调试 Windows 服务 通过点击F5在 Visual Studio 2010 中 使用以下代码 In 程序 cs file static void Main if Environment UserInteractive We ar
  • 在 PHP 扩展中,推荐从 std::string 返回值的方法

    我们有一个简单的 PHP 函数 其目的是调用 C 自由函数std string callLibrary std string 并返回其std string返回值 目前看起来是这样的 PHP FUNCTION call library cha
  • 从 C++ 中的函数返回二维数组[重复]

    这个问题在这里已经有答案了 可能的重复 C 从函数返回多维数组 https stackoverflow com questions 3716595 c returning multidimension array from function
  • 获取不带波形符的泛型类名称[重复]

    这个问题在这里已经有答案了 我正在尝试获取类型名称T使用这个 typeof T Name 班级名称是ConfigSettings 而不是返回ConfigSettings它正在返回ConfigSettings 1 有什么具体原因吗 我怎样才能
  • 用于轻松动态反射的 C# 库

    是否有任何库 例如开源项目等 可以更轻松地使用复杂的反射 例如动态创建对象或类 检查实例等 Thanks 有一个LinFu http www codeproject com KB cs LinFuPart1 aspx可用的库除了反射之外还可
  • 等于方法实现助手 (C#)

    每次我编写一些数据类时 我通常都会花很多时间编写 IEquatable 实现 我写的最后一堂课是这样的 public class Polygon public Point Vertices get set 实施 IEquatable 是一项
  • “已经有一个与此命令关联的打开的 DataReader,必须先将其关闭。”

    我正在开发需要连接到另一个数据库以获取一些数据的应用程序 为此 我决定使用 SqlConnection reader 等 我需要执行一些查询 例如首先我需要获取某个用户的卡 ID 之后我需要通过该卡 ID 获取一些数据 这是我的代码 reg
  • gcc 删除内联汇编代码

    看起来 gcc 4 6 2 删除了它认为函数中未使用的代码 test c int main void goto exit handler asm volatile jmp 0x0 exit return 0 拆解main 0x0804840
  • 在unity3D中显示数学方程

    我想使用它的 GUI 系统统一显示数学方程 有办法吗 我正在使用 C 语言在 Unity 中进行编程 如果我还可以使用 C 代码显示数学符号 这对我来说会很有用 谢谢 自 2016 年起 您可以使用TEXDraw https assetst
  • C# 的 user32 和内核方法列表 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有没有一个很好的清单来说明我们可以从中进口什么user32 dll and kernel dll并在 C 中使用 我是 Windows A
  • 捆绑 pathsForResourcesOfType:inDirectory:

    在我的应用程序中 我有很多图片 分为几个类别 以下是项目内和我的硬盘上的应用程序树 ApplicationName Resources Thumbs Images Buttons Default png 在拇指文件夹中 我有很多 png 文
  • 如何在控制台程序中获取鼠标位置?

    如何在 Windows 控制台程序中用 C 获取鼠标单击位置 点击时返回鼠标位置的变量 我想用简单的文本命令绘制一个菜单 这样当有人点击时 游戏就会注册它并知道位置 我知道如何做我需要做的一切 除了单击时获取鼠标位置 您需要使用 Conso
  • 为什么 g++ 在编译的二进制文件中存储类名?

    我注意到如果我跑strings在我编译的程序上g 输出包含它使用的各种类的名称 该程序是用 O3并且没有 g or p 并且当我剥离二进制文件时 类名仍然存在 我想知道为什么有必要g 将此信息存储在二进制文件中 出现的类名似乎都是使用虚函数
  • AllowUserToAddRows 不适用于 DataGridView 上的 List<> 数据源

    我有一个DataGridView与DataSource set to List
  • 使用客户端 hello 消息进行 TLS 协议检测

    我需要检测网络流量中的 https 数据包 到目前为止 我将所有 443 标记为 https 但我不想再在这种情况下使用端口信息 检查客户端问候消息是否足够 Check 22 and version info 0300 0301 or 03
  • XSD、泛型和 C# 类的困境

    我有以下简单的 XSD 文件
  • 如何重写(重新实现)QFileSystemModel 中的成员函数

    我已经为此苦苦挣扎了一段时间 Qt s QFileSystemModel由于图标获取算法非常糟糕 在获取数百个文件时速度非常慢 我想完全禁用图标 它们被提取到QFileSystemModel data方法不是虚拟的 QFileSystemM
  • 错误:C# 尝试读取或写入受保护的内存

    我很难纠正这个错误 该应用程序在 4 台不同的机器上进行了测试 在其中 3 台上运行良好 但一台 Vista PC 在尝试通过 WebBrowser1 打开页面时出现此错误 解决这个问题的任何帮助对我都会非常有帮助 System Acces

随机推荐