5

ファイルからジャンボ アイコンを取得するコードがいくつかあります。

// 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になるかどうかを確認する方法はありますか?そうでない場合は、通常のシステム アイコンを取得します。

ノート:

以下のジョナサンに触発された最終的な解決策:

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;
}

結果を取得し、それを でSTATICコントロールにHBITMAP入れました。SS_BITMAP

私が学んだ重要なことの 1 つは、 HookProc内で from を使用できないことです。Windows の既知の制限。私は窓に行ってからそれを使わなければなりませんでした。IShellItemImageFactoryPostMessage

4

1 に答える 1

1

これを行う適切な方法は、使用せずSHGetFileInfo、代わりにフラグIShellItemImageFactory::GetImage付きのメソッドを使用することだと思います。SIIGBF_THUMBNAILONLY

于 2012-09-19T23:12:47.760 に答える