<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Гайдар Магдануров : Windows Forms</title><link>http://blogs.msdn.com/gaidar/archive/tags/Windows+Forms/default.aspx</link><description>Tags: Windows Forms</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Получение иконки, ассоциированной с некоторым типом файла</title><link>http://blogs.msdn.com/gaidar/archive/2008/11/13/9064737.aspx</link><pubDate>Thu, 13 Nov 2008 03:03:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9064737</guid><dc:creator>gaidar</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/gaidar/comments/9064737.aspx</comments><wfw:commentRss>http://blogs.msdn.com/gaidar/commentrss.aspx?PostID=9064737</wfw:commentRss><description>&lt;P&gt;Три часа утра, разгребаю почту скопившуюся за день и натыкаюсь на письмо с вопросом о том, как получить иконку для файла с определенным расширением. Первой мыслью было - сказать о WinAPI функции ExtractIcon и пойти спать, но почему-то эта мысль не победила желание написать пару строк кода.&lt;/P&gt;
&lt;P&gt;Я быстренько накидал вот такой прототип:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/gaidar/WindowsLiveWriter/8266a8587fbf_2873/image_2.png" mce_href="http://blogs.msdn.com/blogfiles/gaidar/WindowsLiveWriter/8266a8587fbf_2873/image_2.png"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=142 alt=image src="http://blogs.msdn.com/blogfiles/gaidar/WindowsLiveWriter/8266a8587fbf_2873/image_thumb.png" width=103 border=0 mce_src="http://blogs.msdn.com/blogfiles/gaidar/WindowsLiveWriter/8266a8587fbf_2873/image_thumb.png"&gt;&lt;/A&gt;&amp;nbsp; (использую Zoom для растягивания элемента в Picture).&lt;/P&gt;
&lt;P&gt;Для этого интерфейса создаю коллекцию объектов FileIcon описанных ниже&amp;nbsp; и привязываю к форме:&lt;/P&gt;
&lt;P&gt;private void FormMain_Load(object sender, EventArgs e) &lt;BR&gt;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FileIcons.FileIconCollection col = FileIconCollection.GetSystemFileIcons(); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; extCombo.DataSource = col.FileIcons; &lt;/P&gt;
&lt;P&gt;} &lt;/P&gt;
&lt;P&gt;private void extCombo_SelectedIndexChanged(object sender, EventArgs e) &lt;BR&gt;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; extPicture.Image = ((FileIcon)extCombo.SelectedItem).Icon.ToBitmap(); &lt;BR&gt;}&lt;/P&gt;
&lt;P&gt;Сами объекты:&lt;/P&gt;
&lt;P&gt;public class FileIcon &lt;BR&gt;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public Icon Icon { get; set;} &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string FileExtension { get; set;} &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public override string ToString() &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return FileExtension; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;}&lt;/P&gt;
&lt;P&gt;Самое интересное - как получить коллекцию. На самом деле это очень просто - вся информация о привязаных к определенному расширению файла иконках храниться в реестре в ветке HKEY_CLASSES_ROOT, вот оттуда их можно и вытащить, а с помощью ExtractIcon получить саму иконку. Код очень простой:&lt;/P&gt;
&lt;P&gt;public class FileIconCollection &lt;BR&gt;{ &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // WinAPI function &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [DllImport("shell32.dll", EntryPoint = "ExtractIconA", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)] &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private static extern IntPtr ExtractIcon(int hInst, string lpszExeFileName, int nIconIndex); &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public List&amp;lt;FileIcon&amp;gt; FileIcons { get; private set; } &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private FileIconCollection() { } &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private static Icon GetIcon(string iconPath) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int strIndex = iconPath.IndexOf(","); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string iconFileName = (strIndex &amp;gt; 0) ? iconPath.Substring(0, strIndex) : iconPath; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int iconFileIndex; &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int.TryParse(iconPath.Substring(strIndex + 1), out iconFileIndex); &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Grab icon handle &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IntPtr hIcon = ExtractIcon(0, iconFileName, iconFileIndex); &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return (hIcon != IntPtr.Zero) ? Icon.FromHandle(hIcon) : null; &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static FileIconCollection GetSystemFileIcons() &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; List&amp;lt;FileIcon&amp;gt; list = new List&amp;lt;FileIcon&amp;gt;(); &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RegistryKey extRoot = Registry.ClassesRoot; &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (string key in extRoot.GetSubKeyNames()) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // skip if it is non file extension&amp;nbsp; key &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (String.IsNullOrEmpty(key) || (key.IndexOf(".") != 0)) continue; &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RegistryKey extKey = extRoot.OpenSubKey(key); &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // skip if no such element &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ((extKey == null) || (extKey.GetValue("") == null)) continue; &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // get sub key &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string iconKey = String.Format("{0}\\DefaultIcon", extKey.GetValue("")); &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RegistryKey extIcon = extRoot.OpenSubKey(iconKey); &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // skip if no such element &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ((extIcon == null) || (extIcon.GetValue("") == null)) continue; &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FileIcon fi = new FileIcon { FileExtension = key, Icon = GetIcon(extIcon.GetValue("").ToString()) }; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; extIcon.Close(); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; list.Add(fi); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; extRoot.Close(); &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return new FileIconCollection { FileIcons = list }; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;}&lt;/P&gt;
&lt;P&gt;Надеюсь, что несмотря на позднее время (или очень раннее) код понятен. &lt;A class="" href="http://blogs.msdn.com/gaidar/attachment/9064737.ashx" mce_href="http://blogs.msdn.com/gaidar/attachment/9064737.ashx"&gt;Прицепил исходный код в виде solution для VS2008&lt;/A&gt;.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9064737" width="1" height="1"&gt;</description><enclosure url="http://blogs.msdn.com/gaidar/attachment/9064737.ashx" length="38828" type="application/x-zip-compressed" /><category domain="http://blogs.msdn.com/gaidar/archive/tags/Other/default.aspx">Other</category><category domain="http://blogs.msdn.com/gaidar/archive/tags/Windows+Forms/default.aspx">Windows Forms</category></item></channel></rss>