gpt4 book ai didi

delphi - 如何在Windows中获取任何文件的关联图标(.ICO)并在Delphi中显示所有图标图像大小?

转载 作者:行者123 更新时间:2023-12-03 15:52:32 24 4
gpt4 key购买 nike

我想要一个函数,它可以获取Windows中的任何文件路径(任何文件系统对象——文件、文件夹、驱动器、快捷方式等)并返回关联的.ICO文件(或带有所有图像的图标的一些句柄)尺寸表示)。例如,如果我在 Windows 7 中指定“C:\MyTextFile.txt”,我将在位于 imageres 的 .ICO 文件中获取 .txt 文件的所有 256x256、48x48、32x32 和 16x16 表示形式。 dll 位于偏移量 102 处:

Text file icon in imageres.dll

^ Stardock IconPackager 安装的图标选项卡,用于定位文件系统对象的图标

从我迄今为止的研究来看,这似乎并不那么容易。有 ExtractIconEx 函数,但它只提供 16 和 32px 表示。还有this post显示如何获取 SHIL_SMALLSHIL_LARGESHIL_EXTRALARGESHIL_JUMBO 尺寸,通常为 16、32 、 48 和 256 像素分别。但是,这并不一定涵盖存储在 .ICO 文件中的其他大小。例如,某些图标存储 10 种或更多不同的尺寸,而不仅仅是四种。

所以,我正在尝试:

  1. 查找文件系统对象图标的位置,并且
  2. 从 DLL、EXE 或封装它的任何资源中检索它。

我想一个问题是:这是 Windows 注册表的一项任务吗?如下所示,注册表的 txtfile->DefaultIcon 值包含 .txt 文件类型的图标位置。

txtfile in Windows registry

但是,也有一些独立的 .exe 文件,例如,它们自包含一个不会存储在注册表中的图标。

最终,我想在 TImage 中显示所有不同的大小,并可能将它们一起输出到 .ICO 文件中。任何帮助将不胜感激。

最佳答案

作为一个选项,有一个 IShellItemImageFactory 接口(interface),它提供有关 IShellItem (文件)缩略图的信息。这个界面可以返回所需的大小,但它需要一些图标透明度的魔法。有 2 个选项 - 缩略图或图标。对于文件夹,它总是返回相同的图像(更新:这不是真的,文件夹缩略图还包含它所包含的文件的小预览)。但例如对于 png ,它返回带有 thumbnail 标志的小预览图像和带有 icon 标志的 png-image-icon (0 是默认值)。对于您的任务,您应该使用 SIIBBF_ICONONLY 标志来获取文件/文件夹/驱动器系统图标。

这里是示例代码,它加载不同尺寸的图像。

type
TIconSize = (is16, is32, is48, is64, is96, is128, is256);
const
ICON_SIZE : array[TIconSize] of integer = (16,32,48,64,96,128,256);

我在表单上添加了 SizeRadioGroup : TRadioGroupImage1 : TImageImage1.Size 设置为 256。SizeRadioGroup 点击事件处理程序将缩略图加载到 Image1:

procedure TForm7.SizeRadioGroupClick(Sender: TObject);
const FILE_NAME = 'd:\_projects\';
var icoSize : TIconSize;
wh : integer;
siif : IShellItemImageFactory;
size : TSize;
icon_handle : HBitmap;
bm : TBitmap;
begin
icoSize := TIconSize(SizeRadioGroup.ItemIndex);
wh := ICON_SIZE[icoSize];

SHCreateItemFromParsingName(FILE_NAME, nil, IID_IShellItemImageFactory, siif);

size.cx := wh;
size.cy := wh;

siif.GetImage(size, 0 {SIIGBF_THUMBNAILONLY}{SIIGBF_ICONONLY}, icon_handle);
bm := TBitmap.Create();
bm.PixelFormat := pf32bit;
try
bm.Handle := icon_handle;
Image1.Picture.Assign(bm);
finally
bm.Free();
end;
end;

关于delphi - 如何在Windows中获取任何文件的关联图标(.ICO)并在Delphi中显示所有图标图像大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15103361/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com