我最近需要获取任何文件类型的图标,我想要一个大图标,所以我使用SHImageList作为this C# answer suggested。
我很难得到任何工作。我使用SHGetFileInfo,但只返回32x32px图标,我更喜欢256x256图标。
基于the reference我可以弄清楚前两个参数,但我还没弄清楚第三个参数是什么。我应该放None
吗?虽然基于this blog post,但第三个参数是HImageList
,但我还没有找到任何HImageList
的结构。我的代码的相关片段是:
SHIL_JUMBO = 0x000000004
iidImageList=GUID("{46EB5926-582E-4017-9FDF-E8998DAA0950}")
hico=??
hres=ctypes.windll.shell32.SHGetImageList(SHIL_JUMBO,byref(iidImageList),hico)
hdc.DrawIcon( (0,0), hico )
hbmp.SaveBitmapFile( hdc, tempDirectory + "\Icontemp.bmp")
我应该如何初始化hico以及什么类型?
此外,为避免XY问题,对此问题的回答可以提供获取任何文件类型图标的替代方法。 (最好使用Pillow或PyQt)
编辑:嗯,我想我不清楚我需要什么。我需要启动一个HImageList类型。我改变了标题,以反映编辑。另外,对于XY问题。要求是程序是用Python编写的(除非可以证明这是不可能的)。答案 0 :(得分:2)
SHGetImageList
会返回图片列表,而非图标。
您需要将其与SHGetFileInfo
:
SHGetFileInfo
为您提供系统图片列表中的图标索引(使用SHGFI_SYSICONINDEX
标志)SHGetImageList
为您提供了巨型图片列表(使用SHIL_JUMBO
)。然后,您可以使用ImageList_DrawEx
绘制图标,或使用ImageList_ExtractIcon
宏或ImageList_GetIcon
将其作为HICON
从图标列表中提取。请注意,虽然SHGetImageList
会返回IImageList
interface,但指向这些内容的指针可以自由转换为HIMAGELIST
。
伪代码:
SHFILEINFO sfi;
SHGetFileInfo(L"c:\file.txt", 0, &sfi, sizeof(sfi),
SHGFI_SYSICONINDEX);
HIMAGELIST hil;
SHGetImageList(SHIL_JUMBO, IID_IImageList, &hil);
ImageList_DrawEx(hil, sfi.iIcon, hdc, x, y, 0, 0,
CLR_NONE, CLR_NONE, ILD_NORMAL);