0

具体的には、さまざまな Windows システム (主に XP と Win7 または Win8) で実行される Windows プログラムを作成しようとしています。システムファイルのどこかからシステムのデフォルトアイコンをロードしたい(どちらも知らない)。それは可能ですか、どうすればそれを行うことができますか?

たとえば、Text.txt ファイルのアイコンは Windows XP では表示されますが、Win7 では別のアイコンになります。XP のごみ箱も、Win7 のごみ箱とは異なります。では、このシステム依存のアイコンをプログラムのどこにロードできますか?? ps .NET ではなく、VC6 を使用しています。

4

1 に答える 1

2

特定の種類のファイルのアイコンが必要な場合は、SHGetFileInfo. たとえば、テキスト ファイルのアイコンを取得するには、次のようにします。

SHFILEINFO sfi;
if (SHGetFileInfo(L".txt", FILE_ATTRIBUTE_NORMAL, &sfi, sizeof(sfi), SHGFI_ICON | SHGFI_USEFILEATTRIBUTES ))
{
    // you now have the icon in sfi.hIcon
    // remember to destroy it when you are done with it
    DestroyIcon(sfi.hIcon);
}

SHGFI_ICONフラグは、大きなアイコンが必要であることを示しています。フラグを追加しSHGFI_SMALLICONて小さなアイコンを取得できます。

SHGFI_USEFILEATTRIBUTES渡すファイル名が存在する必要がないことを示します。関数は、特定の既存のファイルではなく、ファイル クラスのアイコンを返します。特定のファイルのアイコンが必要な場合は、ファイルのフル パス名をSHGetFileInfo関数に渡し、このフラグを省略します。

ごみ箱のようなシステム フォルダのアイコンが必要な場合は、この関数でそれも実行できます。例えば:

LPITEMIDLIST pidl;
if (SUCCEEDED(SHGetFolderLocation(0, CSIDL_BITBUCKET, 0, 0, &pidl)))
{
    SHFILEINFO sfi;
    if (SHGetFileInfo((LPCWSTR)pidl, 0, &sfi, sizeof(sfi), SHGFI_ICON | SHGFI_PIDL))
    {
        // you now have the icon in sfi.hIcon
        // remember to destroy it when you are done with it
        DestroyIcon(sfi.hIcon);
    }
    CoTaskMemFree(pidl);
}

SHGetFileInfoフラグの完全なリストについては、ドキュメントを参照してください。また、これらの関数を使用する前に、COM を呼び出しOleInitialize()たりCoInitializeEx()、COM を初期化したことを確認してください。

于 2013-09-30T06:44:18.143 に答える