13

我正在尝试在 Windows 中获取高分辨率图标或缩略图,并给出该文件的完整路径。不需要是缩略图——一个好看的图标会很棒我不在乎它是一个HICON还是一个HBITMAP:我将把它放在一个 GDI+ 对象中并将它渲染到一个设备上下文中。

我试过使用SHGetFileInfo(在标志上有各种变化),但从来没有得到超过~32x32 的图标,它可怕地缩放到我需要的 128 像素左右。

if (!SHGetFileInfoW(path, 0, &fi, sizeof(fi),
                    SHGFI_ICON | SHGFI_ICONLARGE | SHGFI_TYPENAME))
    return GetLastError();

// fi.hIcon is a valid icon here, but it's horrible quality with
// a black mask on it. I want higher quality, and dare I dream of
// alpha channel? Mask is acceptable, i suppose.

SHGetFileInfo""当我调用时返回SHGFI_ICONLOCATION(这似乎是该 API 的一个已知问题)。

我也尝试过使用SHCreateItemFromParsingNamename 来获取IThumbnailProvider,但BindToHandler总是E_NOTIMPL返回BHID_ThumbnailHandler...

IShellItem *psi;
hr = SHCreateItemFromParsingName(path, NULL, IID_PPV_ARGS(&psi));
if (SUCCEEDED(hr))
{
    IThumbnailProvider *pThumbProvider;
    hr = psi->BindToHandler(NULL, BHID_ThumbnailHandler,
                            IID_PPV_ARGS(&pThumbProvider));
    if (SUCCEEDED(hr))
    { 
    // never get here because hr == E_NOTIMPL !!!

我实际上已经运行了 Microsoft Thumbnail Providers Sample,发现它与BindToInterface.

那么,关于我还能尝试什么的任何建议?我只是想要一些或多或少代表这个文件的图片-y,例如,至少 100 像素大小 - 只是比 32x32 更好的任何东西......

4

2 回答 2

7

如果您的目标是 Vista 或更高版本,您可以从巨型图像列表中获取 256x256 图标。如果您需要针对 XP,您至少可以使用超大图像列表,即 48x48(略好于 32x32 大)。

#include <commoncontrols.h>
#include <shellapi.h>

HICON GetHighResolutionIcon(LPTSTR pszPath)
{
    // 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_TRANSPARENT, &hico);

    // Clean up
    piml->Release();

    // Return the icon
    return hico;
}
于 2012-09-14T17:14:27.627 回答
1

你试过ExtractIconEx()吗?

它具有专用参数,可从可执行文件、DLL 或图标文件中提取大小图标数组。从那里您可以选择最适合您需要的尺寸。API 调用从 Win2K 开始可用。

于 2012-09-14T03:11:46.153 回答