検索してみると、時代ごとにやり方があったようで、複数の方法が引っ掛かる。
現時点では最後のサムネイル取得でいいのか?(Windows XPはもういいだろうということで)
System.Drawing.Icon.ExtractAssociatedIcon
- あ、これまだ試してない…。普通すぎて盲点だった。たぶん小さいアイコン。
SHGetFileInfo() で SHGFI_LARGEICON を指定する
- コード例は検索すると出てくるので省略。
- SHGFI_LARGEICONで32x32サイズ。
SHGetFileInfo() → SHGetImageList() で SHIL_EXTRALARGE/SHIL_JUMBO を指定する → IImageList::GetIcon()
- これもコード例は省略
- How to have large file icons with SHGetFileInfo in C# | Tabbles
http://tabbles.net/blog/how-to-have-large-file-icons-with-shgetfileinfo-in-c/
- How to have large file icons with SHGetFileInfo in C# | Tabbles
- SHIL_JUMBOで256x256サイズ
- 問題点としては、例えばSHIL_JUMBOを指定して、256x256サイズのアイコンのないアプリのアイコンを取得した場合に、おかしな画像になる。
- 256x256サイズの画像の左上に小さいアイコンが出てくる。以下でも悩んでいる人がいたけど、解決しなかったみたい。
- c# - SHGetImageList - SHIL_JUMBO for smaller icons (32,32) - Stack Overflow
http://stackoverflow.com/questions/6457999/shgetimagelist-shil-jumbo-for-smaller-icons-32-32
- あと、Windows XPに対応するなら、SHGetImageList() をDLLインポートする時に注意が必要みたい。
- pinvoke.net: SHGetImageList (shell32)
http://www.pinvoke.net/default.aspx/shell32/SHGetImageList.html - BUG「エラー LNK2001 エラーになる」エラー メッセージを Windows XP ベースのシステム上で SHGetImageList をコールする場合
http://support.microsoft.com/kb/316931/ja - まじめにやるなら、名前で取得して、失敗したら番号で取得みたいな。まぁ番号は変わらないだろうということなら番号で。
- pinvoke.net: SHGetImageList (shell32)
SHCreateItemFromParsingName() → IShellItemImageFactory::GetImage()
- コード例は以下にある
- WindowsR API Code Pack for MicrosoftR .NET Framework - Home
http://archive.msdn.microsoft.com/WindowsAPICodePack - ShellObject.cs や ShellThumbnail.cs のあたり
- WindowsR API Code Pack for MicrosoftR .NET Framework - Home
- それかpinvoke.net
- pinvoke.net: IShellItemImageFactory (Interfaces)
http://www.pinvoke.net/default.aspx/Interfaces/IShellItemImageFactory.html - 項目ごとにページが分かれているので、足りないところはリンクをたどってコピペする。
- pinvoke.net: IShellItemImageFactory (Interfaces)
- Windows Vista以降みたい。
- かいつまんで書くとこんな感じ?:
[DllImport("shell32.dll", CharSet = CharSet.Unicode, PreserveSig = false)] public static extern void SHCreateItemFromParsingName( [In][MarshalAs(UnmanagedType.LPWStr)] string pszPath, [In] IntPtr pbc, [In][MarshalAs(UnmanagedType.LPStruct)] Guid riid, [Out][MarshalAs(UnmanagedType.Interface, IidParameterIndex = 2)] out IShellItem ppv); [ComImportAttribute()] [GuidAttribute("bcc18b79-ba16-442f-80c4-8a59c30c463b")] [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] public interface IShellItemImageFactory { void GetImage( [In, MarshalAs(UnmanagedType.Struct)] SIZE size, [In] SIIGBF flags, [Out] out IntPtr phbm); } string sourceFile = "C:\xxxxx.txt"; IntPtr hbitmap = IntPtr.Zero; IShellItem iShellItem = null; Guid iIdIShellItem = new Guid("43826d1e-e718-42ee-bc55-a1e261c37bfe"); SHCreateItemFromParsingName(sourceFile, IntPtr.Zero, iIdIShellItem, out iShellItem); ((IShellItemImageFactory)iShellItem).GetImage(new SIZE(256, 256), 0x0, out hbitmap);