使用SHGetImageList:如何使用HImageList?

时间:2015-05-28 01:14:56

标签: python winapi ctypes

我最近需要获取任何文件类型的图标,我想要一个大图标,所以我使用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编写的(除非可以证明这是不可能的)。

1 个答案:

答案 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);