Если нашел этот код на сайте некоторое время назад, чтобы сделать это:
class Win32
{
public const uint SHGFI_ICON = 0x100;
public const uint SHGFI_LARGEICON = 0x0; // 'Large icon
public const uint SHGFI_SMALLICON = 0x1; // 'Small icon
[DllImport("shell32.dll")]
public static extern IntPtr SHGetFileInfo(string pszPath, uint dwFileAttributes, ref SHFILEINFO psfi, uint cbSizeFileInfo, uint uFlags);
public static Bitmap GetFileIcon(string fName)
{
IntPtr hImgSmall; //the handle to the system image list
SHFILEINFO shinfo = new SHFILEINFO();
hImgSmall = Win32.SHGetFileInfo(fName, 0, ref shinfo, (uint)Marshal.SizeOf(shinfo), Win32.SHGFI_ICON | Win32.SHGFI_SMALLICON);
return Icon.FromHandle(shinfo.hIcon).ToBitmap();
}
}
[StructLayout(LayoutKind.Sequential)]
public 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;
};
также необходимо
using System.Drawing;
using System.Runtime.InteropServices;
ссылаться на все соответствующие классы
Единственное, что я хотел бы добавить здесь, это SHGFI_USEFILEATTRIBUTES = 0x010. Из MSDN: если параметр uFlags включает флаг SHGFI_USEFILEATTRIBUTES, этот параметр не должен быть допустимым именем файла. Функция будет действовать так, как если бы файл существовал с указанным именем и с атрибутами файла, переданными в параметре dwFileAttributes. Это позволяет вам получать информацию о типе файла, передавая только расширение для pszPath и передавая FILE_ATTRIBUTE_NORMAL в dwFileAttributes. –
Это оказалось более правильным для моей потребности, чем класс, рекомендованный Нолдорином. Хотя класс мог идентифицировать многие значки, он иногда не нашел тот, который фактически использовался. Представленный здесь код всегда находит тот же значок, который находится на рабочем столе. Большое спасибо. –