ピースペース

拡張子から小さなアイコンをGetするには、SHGetFileInfoをUSEFILEATTRIBUTESを追加して使う

leave a comment »

ファイルのアイコンをGetするには、Icon.ExtractAssociatedIconメソッドを使う
http://www.atmarkit.co.jp/fdotnet/dotnettips/432extracticon/extracticon.html

でもこれ、GetできるIconが32×32固定だったり
ファイルがDBなどに格納されている場合に使えなかったり

ということで、拡張子だけから小さなアイコンをGetする方法を調べてみた。
最初、拡張子に関連付けされたアプリケーション(exe)のアイコンをGetする方法を試すも
.txtのアイコンとnotepad.exeのアイコンは一緒でないのネ 知らなかった;;

小さいアイコンをGetするには、SHGetFileInfoを使うしかないらしく、
そして、拡張子だけからそれを得るには、USEFILEATTRIBUTESフラグを使う必要があるらしい。

public static System.Drawing.Icon GetSmallIconByExtension(string extension)
{
    string fileName = "*" + extension;
    SHFILEINFO shinfo = new SHFILEINFO();
    IntPtr hSuccess = SHGetFileInfo(fileName, 0, ref shinfo, (uint)Marshal.SizeOf(shinfo), SHGFI_ICON | SHGFI_SMALLICON | SHGFI_USEFILEATTRIBUTES);
    if (hSuccess == IntPtr.Zero) return null;
    return System.Drawing.Icon.FromHandle(shinfo.hIcon);
}

[DllImport("shell32.dll")]
private static extern IntPtr SHGetFileInfo(string pszPath, uint dwFileAttributes, ref SHFILEINFO psfi, uint cbSizeFileInfo, uint uFlags);

// SHGetFileInfo関数で使用するフラグ
private const uint SHGFI_ICON = 0x100; // アイコン・リソースの取得
private const uint SHGFI_LARGEICON = 0x0; // 大きいアイコン
private const uint SHGFI_SMALLICON = 0x1; // 小さいアイコン
private const uint SHGFI_USEFILEATTRIBUTES = 0x10;

// SHGetFileInfo関数で使用する構造体
private struct SHFILEINFO
{
    public IntPtr hIcon;
    public IntPtr iIcon;
    public uint dwAttributes;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
    public string szDisplayName;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
    public string szTypeName;
};

Written by nasu38yen

2010年5月28日 @ 7:37 AM

カテゴリー: 未分類

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。