2

ファイルとフォルダーの両方のシステム アイコンを取得するために使用SHFileInfoしていますが、特別なフォルダーが正しいフォルダー アイコンを返さないことがわかりました。

たとえば、デスクトップ フォルダは、デスクトップ アイコンではなく、通常のフォルダと同じフォルダ アイコンを返します。また、MyComputer アイコンは、予想していた Windows 7 の MyComputer アイコンではなく、古い Windows 98 のアイコンのように見えます。

特別なフォルダに間違ったアイコンが表示されるのはなぜですか? を使用して特別なフォルダの正しいシステム アイコンを取得するにはどうすればよいSHFileInfoですか?

私の元のコードはこのコードプロジェクトの記事から来ましたが、少し変更されています。実際に実行されるコードはかなり似ていますが、次のようになります。

public static System.Drawing.Icon GetFolderIcon(string folderPath, IconSize size, FolderType folderType)
{
    try
    {
        // Need to add size check, although errors generated at present!
        Int64 flags = WinApi.SHGFI_ICON | WinApi.SHGFI_USEFILEATTRIBUTES;

        if (FolderType.Open == folderType)
            flags |= WinApi.SHGFI_OPENICON;

        if (IconSize.Small == size)
            flags |= WinApi.SHGFI_SMALLICON;
        else
            flags |= WinApi.SHGFI_LARGEICON;

        // Get the folder icon
        WinApi.SHFILEINFO shfi = new WinApi.SHFILEINFO();
        WinApi.SHGetFileInfo(folderPath,
            WinApi.FILE_ATTRIBUTE_DIRECTORY,
            ref shfi,
            (Int32)System.Runtime.InteropServices.Marshal.SizeOf(shfi),
            flags);

        if (shfi.hIcon == IntPtr.Zero)
            return null;

        // Now clone the icon, so that it can be successfully stored in an ImageList
        System.Drawing.Icon icon = (System.Drawing.Icon)System.Drawing.Icon.FromHandle(shfi.hIcon).Clone();

        WinApi.DestroyIcon(shfi.hIcon);     // Cleanup
        return icon;
    }
    catch (Exception ex)
    {
        // Log Error
    }

    return null;
}

呼び出しは次のようになります。

var icon = IconUtil.GetFolderIcon(
    Environment.GetFolderPath(Environment.SpecialFolder.Desktop), 
    IconUtil.IconSize.Large, IconUtil.FolderType.Closed);

このようなアイコンが表示されます

ここに画像の説明を入力

これの代わりに

ここに画像の説明を入力

ここに画像の説明を入力

ここに画像の説明を入力

4

1 に答える 1