SHGetFileInfo (shell32)
Last changed: Vasily-178.121.89.146

.
Summary

C# Signature:

[DllImport("shell32.dll")]
static extern IntPtr SHGetFileInfo(string pszPath, uint dwFileAttributes,
   out SHFILEINFO psfi, uint cbFileInfo, uint uFlags);

User-Defined Types:

None.

Notes:

None.

Tips & Tricks:

Please add some!

Sample Code:

    //
    // From http://groups.google.com/groups?hl=en&lr=&ie=UTF-8&selm=uMD%23VHmqBHA.2368%40tkmsftngp03&rnum=4
    //

    using System;
    using System.Runtime.InteropServices;
    using System.Drawing;

    /// <summary>
    /// Summary description for ExtractIcon.
    /// </summary>
    public class ExtractIcon
    {
    [DllImport("Shell32.dll")]
    private static extern int  SHGetFileInfo
    (
        string pszPath,
        uint dwFileAttributes,
        out SHFILEINFO psfi,
        uint cbfileInfo,
        SHGFI uFlags
    );

    [StructLayout(LayoutKind.Sequential)]
    private struct SHFILEINFO
    {
        public SHFILEINFO(bool b)
        {
        hIcon=IntPtr.Zero;
        iIcon=0;
        dwAttributes=0;
        szDisplayName="";
        szTypeName="";
        }

        public IntPtr hIcon;
        public int iIcon;
        public uint dwAttributes;
        [MarshalAs(UnmanagedType.LPStr, SizeConst=260)]
        public string szDisplayName;
        [MarshalAs(UnmanagedType.LPStr, SizeConst=80)]
        public string szTypeName;
    };

    private ExtractIcon()
    {
    }

    private enum SHGFI
    {
        SmallIcon       = 0x00000001,
        LargeIcon       = 0x00000000,
        Icon        = 0x00000100,
        DisplayName     = 0x00000200,
        Typename        = 0x00000400,
        SysIconIndex    = 0x00004000,
        UseFileAttributes   = 0x00000010
    }

    /// <summary>
    /// Get the associated Icon for a file or application, this method always returns
    /// an icon.  If the strPath is invalid or there is no idonc the default icon is returned
    /// </summary>
    /// <param name="strPath">full path to the file</param>
    /// <param name="bSmall">if true, the 16x16 icon is returned otherwise the 32x32</param>
    /// <returns></returns>
    public static Icon GetIcon(string strPath, bool bSmall)
    {
        SHFILEINFO info = new SHFILEINFO(true);
        int cbFileInfo = Marshal.SizeOf(info);
        SHGFI flags;
        if (bSmall)
        flags = SHGFI.Icon|SHGFI.SmallIcon|SHGFI.UseFileAttributes;
        else
        flags = SHGFI.Icon|SHGFI.LargeIcon|SHGFI.UseFileAttributes;

        SHGetFileInfo(strPath, 256, out info,(uint)cbFileInfo, flags);
        return Icon.FromHandle(info.hIcon);
    }
    }

Alternative Managed API #1:

C# code to copy and paste starts here!

    /// <summary>
    /// Summary description for ShellIcon.  Get a small or large Icon with an easy C# function call
    /// that returns a 32x32 or 16x16 System.Drawing.Icon depending on which function you call
    /// either GetSmallIcon(string fileName) or GetLargeIcon(string fileName)
    /// </summary>
    public class ShellIcon
    {
        [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;
        };

        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 ShellIcon()
        {
            //
            // TODO: Add constructor logic here
            //
        }

        public static Icon GetSmallIcon(string fileName)
        {
            IntPtr hImgSmall; //the handle to the system image list
            SHFILEINFO shinfo = new SHFILEINFO();

            //Use this to get the small Icon
            hImgSmall = Win32.SHGetFileInfo(fileName, 0, ref shinfo,(uint)Marshal.SizeOf(shinfo),Win32.SHGFI_ICON | Win32.SHGFI_SMALLICON);

            //The icon is returned in the hIcon member of the shinfo struct
            return System.Drawing.Icon.FromHandle(shinfo.hIcon);        
        }

        public static Icon GetLargeIcon(string fileName)
        {
            IntPtr hImgLarge; //the handle to the system image list
            SHFILEINFO shinfo = new SHFILEINFO();

            //Use this to get the large Icon
            hImgLarge = Win32.SHGetFileInfo(fileName, 0, ref shinfo, (uint)Marshal.SizeOf(shinfo), Win32.SHGFI_ICON | Win32.SHGFI_LARGEICON);

            //The icon is returned in the hIcon member of the shinfo struct
            return System.Drawing.Icon.FromHandle(shinfo.hIcon);        
        }
    }

This is where the C# code to copy and paste ends!

Tip for using above code

If you're using a System.Windows.Forms.ImageList to store your images it is helpful to use below settings for icon transparency

//this setting makes the ImageList store the images in 32bit colors which you need for alpha transparency settings

yourImageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth32Bit;

//This stores the images at 16x16 use 32.32 for large icons

yourImageList.ImageSize = new System.Drawing.Size(16, 16);

//Set the transparent color of the ImageList

yourImageList.TransparentColor = System.Drawing.Color.Transparent;

Good Luck and Happy Engineering!

Alternative Managed API:

Do you know one? Please contribute it!

Documentation