Win32 - 确定路径是否有可用的巨型图标

时间:2012-09-18 05:15:22

标签: c++ windows winapi windows-shell

我有一些代码可以从文件中获取巨型图标:

// Get the image list index of the icon
SHFILEINFO sfi;
if (!SHGetFileInfo(pszPath, 0, &sfi, sizeof(sfi), SHGFI_SYSICONINDEX)) return NULL;

// Get the jumbo image list
IImageList *piml;
if (FAILED(SHGetImageList(SHIL_JUMBO, IID_PPV_ARGS(&piml)))) return NULL;

// Extract an icon
HICON hico;
piml->GetIcon(sfi.iIcon, ILD_SCALE|ILD_TRANSPARENT, &hico);

现在,问题是,如果路径没有与之关联的 256x256 图标,我不希望 ImageList 返回的图标。 (它将有助于采用32x32并将其放入256x256图标,我无法使用)。

那么,有没有办法找出,如果与路径相关联的图标有一个巨型图标,或者确实只是缩放32x32?如果没有,我将获得常规系统图标。

注意:

最终解决方案受Jonathan的启发:

HBITMAP hbitmapForFile(LPCWSTR path, int w, int h)
{
    IShellItemImageFactory *pif;    
    HBITMAP hbm;

    SIZE sz = { w, h };
    SHCreateItemFromParsingName(path, NULL, IID_PPV_ARGS(&pif));
    pif->GetImage(sz, SIIGBF_RESIZETOFIT, &hbm);
    pif->Release();
    return hbm;
}

我获取了结果HBITMAP并将其放入带有SS_BITMAP STATIC 控件中。

我学到了一件重要的事情:你无法使用 HookProc 中的IShellItemImageFactory。已知的Windows限制;我不得不PostMessage到窗口然后使用它。

1 个答案:

答案 0 :(得分:1)

我认为正确的方法是不使用SHGetFileInfo,而是使用带有IShellItemImageFactory::GetImage标记的SIIGBF_THUMBNAILONLY方法。