使用 SHGetImageList:如何使用 HImageList?

Using SHGetImageList : how to use HImageList?

我最近需要获取任何文件类型的图标,而且我想要一个大的,所以我使用SHImageList,如

我很难让任何东西工作。我使用的是 SHGetFileInfo,但只有 returns 32x32px 图标,我更喜欢 256x256 的图标。

基于the reference I can figure out the first two arguments, but I have yet to figure out what the third argument is. Am I just supposed to put None? Though based on 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(除非可以证明那是不可能的)。

SHGetImageList returns 图像列表,不是图标。

需要配合SHGetFileInfo使用:

  • SHGetFileInfo 为您提供系统图像列表中的图标索引(使用 SHGFI_SYSICONINDEX 标志)
  • SHGetImageList 为您提供巨型图像列表(使用 SHIL_JUMBO)。

然后您可以使用 ImageList_DrawEx, or extract it from the icon list as an HICON using the ImageList_ExtractIcon macro or by calling ImageList_GetIcon. Note that although SHGetImageList returns an 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);