Сайт для программистов

воскресенье, 31 октября 2010 г.

ExtractAssociatedIcon

C помощью системной функции Windows API ExtractAssociatedIcon можно извлечь значок, ассоциированный с файлом. Значки возвращаются с размером 32х32.

[C#]
[DllImport("shell32.dll")]
static extern IntPtr ExtractAssociatedIcon(IntPtr hInst, StringBuilder lpIconPath,
out ushort lpiIcon);

или

[DllImport("shell32.dll")]
static extern IntPtr ExtractIcon(IntPtr hInst, string lpszExeFileName, int nIconIndex);


Пример



// Отобразим значок какого-нибудь файла
// Добавим в проект элемент OpenFileDialog, кнопку и PictureBox

openFileDialog1.ShowDialog();

ushort uicon;
StringBuilder strB = new StringBuilder(openFileDialog1.FileName);
IntPtr handle = ExtractAssociatedIcon(this.Handle, strB, out uicon);
Icon ico = Icon.FromHandle(handle);

pictureBox1.Image = ico.ToBitmap();


Запустите проект и выберите любой файл на диске. На форме в PictureBox отобразится значок, который используется для выбранного файла (как это мы видим в Проводники).

Описание функции и ее параметров добавлено в справочник по функциям Windows API для .NET Framework.

К слову сказать, совсем не обязательно использовать неуправлямый код. В .NET Framework есть метод Icon.ExtractAssociatedIcon пространства имен System.Drawing, который делает ту же работу.



Добавьте в проект еще одну кнопку и напишите следующий код:

if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
Icon icon = Icon.ExtractAssociatedIcon(openFileDialog1.FileName);
this.Icon = icon;
pictureBox1.Image = icon.ToBitmap();
}


Удачного вам программирования!

1 комментарий:

and1024 комментирует...

Таким методом выводится только значок размером 32х32 (BMP сжатие)!

Для более крупных значков 256х256 (PNG сжатие), если брать Windows 7, метод не подходит!!!

Существует готовый проект: http://www.codeproject.com/KB/cs/IconLib/IconLib_src.zip

Но там при конвертировании из Ico в Bmp, прозрачность становится черной!

Как этого избежать, и сделать белым цветом?