ファイルとフォルダーの両方のシステム アイコンを取得するために使用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);
このようなアイコンが表示されます
これの代わりに