我目前正在使用this post中的方法来获取文件的图标并且它有效。
唯一的问题是,我只能获得图标集的16x16,32x32,48x48和256x256版本。使用巨型版不是一个好主意,因为缩放后图标看起来很糟糕。我相信应该有一种方法来获取特定大小的图标,因为图标文件有超过四种尺寸。但是怎么样?
我不想使用外部库。
答案 0 :(得分:2)
系统维护四种不同大小的图像列表;小(16x16),大(32x32),超大(48x48)和巨型(256x256)。
但请注意,尺寸只是典型的标准尺寸。如果系统设置为不同的DPI缩放系数,则大小可以更改(例如,在200%DPI系统上,大图像列表将为64x64)。
当系统向系统图像列表添加图标时,它会从图标资源中选择最接近的尺寸,以尽可能避免缩放。这意味着,如果一个程序包含一个64x64像素图标,它可能会被用于超大图像,它可能会被用于大图像,它可能甚至被用于小图像(在400%DPI缩放系统上) - 但没有保证。
从可执行文件中明确提取特定大小图标的唯一方法是自行加载。
而不是使用SHGetFileInfo
为您检索图标(或图标索引),而是可以让它告诉您图标来自何处(即包含图标资源和资源索引的可执行文件) )。为此,请使用SHGFI_ICONLOCATION
标志。这将返回包含szDisplayName
中图标的可执行路径,以及iIcon
中图标的索引。
然后,您可以使用其nIconSize
参数将该信息传递给SHDefExtractIcon
函数,以请求特定尺寸的图标。
伪代码:
// find icon location for .txt file icons
SHFILEINFO sfi{};
SHGetFileInfo(L".txt", FILE_ATTRIBUTE_NORMAL, &sfi, sizeof(sfi), SHGFI_USEFILEATTRIBUTES | SHGFI_ICONLOCATION);
// extract the 64x64 pixel icon
HICON hIcon;
SHDefExtractIcon(sfi.szDisplayName, sfi.iIcon, 0, nullptr, &hIcon, MAKELONG(0, 64));