拡張子から小さなアイコンをGetするには、SHGetFileInfoをUSEFILEATTRIBUTESを追加して使う
ファイルのアイコンを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;
};
コメントを残す