Sometimes it’s useful to display an icon for a file in an application and probably the best icon to display is whatever the operating system uses. The Windows API provides the SHGetFileInfo function for this purpose, so here’s a little wrapper around it. All the methods take a file name parameter, but the file doesn’t need to actually exist.
using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; namespace TestIcons { public static class ImageUtilities { [StructLayout(LayoutKind.Sequential)] 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; }; static class Win32 { internal const uint SHGFI_ICON = 0x100; internal const uint SHGFI_LARGEICON = 0x0; // 'Large icon internal const uint SHGFI_SMALLICON = 0x1; // 'Small icon internal const uint SHGFI_USEFILEATTRIBUTES = 0x10; internal const uint SHGFI_LINKOVERLAY = 0x8000; [DllImport("shell32.dll")] public static extern IntPtr SHGetFileInfo(string pszPath, uint dwFileAttributes, ref SHFILEINFO psfi, uint cbSizeFileInfo, uint uFlags); [DllImport("User32.dll")] public static extern int DestroyIcon(IntPtr hIcon); } public static Icon GetSmallIcon(string fileName) { return GetIcon(fileName, Win32.SHGFI_SMALLICON); } public static Icon GetSmallOverlayIcon(string fileName) { return GetIcon(fileName, Win32.SHGFI_SMALLICON | Win32.SHGFI_LINKOVERLAY); } public static Icon GetLargeIcon(string fileName) { return GetIcon(fileName, Win32.SHGFI_LARGEICON); } private static Icon GetIcon(string fileName, uint flags) { SHFILEINFO shinfo = new SHFILEINFO(); IntPtr hImgSmall = Win32.SHGetFileInfo(fileName, 0, ref shinfo, (uint)Marshal.SizeOf(shinfo), Win32.SHGFI_ICON | Win32.SHGFI_USEFILEATTRIBUTES | flags); if (hImgSmall == IntPtr.Zero) return null; Icon icon = (Icon)Icon.FromHandle(shinfo.hIcon).Clone(); Win32.DestroyIcon(shinfo.hIcon); return icon; } } }
No comments:
Post a Comment