geticoninfo (user32)
Last changed: Makarevich Ivan-93.125.39.169

.
Summary

C# Signature:

[StructLayout(LayoutKind.Sequential)]
struct ICONINFO
{
     public bool fIcon;         // Specifies whether this structure defines an icon or a cursor. A value of TRUE specifies
                    // an icon; FALSE specifies a cursor.
     public Int32 xHotspot;     // Specifies the x-coordinate of a cursor's hot spot. If this structure defines an icon, the hot
                    // spot is always in the center of the icon, and this member is ignored.
     public Int32 yHotspot;     // Specifies the y-coordinate of the cursor's hot spot. If this structure defines an icon, the hot
                    // spot is always in the center of the icon, and this member is ignored.
     public IntPtr hbmMask;     // (HBITMAP) Specifies the icon bitmask bitmap. If this structure defines a black and white icon,
                    // this bitmask is formatted so that the upper half is the icon AND bitmask and the lower half is
                    // the icon XOR bitmask. Under this condition, the height should be an even multiple of two. If
                    // this structure defines a color icon, this mask only defines the AND bitmask of the icon.
     public IntPtr hbmColor;    // (HBITMAP) Handle to the icon color bitmap. This member can be optional if this
                    // structure defines a black and white icon. The AND bitmask of hbmMask is applied with the SRCAND
                    // flag to the destination; subsequently, the color bitmap is applied (using XOR) to the
                    // destination by using the SRCINVERT flag.
}        

[DllImport("user32.dll")]
static extern bool GetIconInfo(IntPtr hIcon, out ICONINFO piconinfo);

VB.Net

Public Declare Function GetIconInfo Lib "user32" (ByVal hIcon As IntPtr, ByVal piconinfo As ICONINFO) As Boolean

User-Defined Types:

None.

Notes:

None.

Tips & Tricks:

Please add some!

Sample Code:

The hbmColor and hbmMask are pointers to unmanaged data and must be deleted after use. The following code will grab the icon info for a cursor handle and dispose of the unmanaged resources, if needed:

    public class IconInfo : IDisposable {
    private ICONINFO ii;

    public IconInfo(IntPtr hCursor) {
        if (!GetIconInfo(hCursor, out ii)) {
        throw new Exception("Bad hCursor");
        }
    }

    public Bitmap ColorBitmap {
        get {
        if (ii.hbmColor == IntPtr.Zero) return null;
        return Image.FromHbitmap(ii.hbmColor);
        }
    }

    public Bitmap MaskBitmap {
        get {
        if (ii.hbmMask == IntPtr.Zero) return null;
        return Image.FromHbitmap(ii.hbmMask);
        }
    }
    public Point HotPoint {
        get {
        return new Point(ii.xHotspot, ii.yHotspot);
        }
    }

    void IDisposable.Dispose() {
        if (ii.hbmColor != IntPtr.Zero) DeleteObject(ii.hbmColor);
        if (ii.hbmMask != IntPtr.Zero) DeleteObject(ii.hbmMask);
    }

    [DllImport("gdi32.dll", EntryPoint = "DeleteObject")]
    static extern IntPtr DeleteObject(IntPtr hDc);

    [DllImport("user32.dll")]
    static extern bool GetIconInfo(IntPtr hIcon, out ICONINFO piconinfo);

    [StructLayout(LayoutKind.Sequential)]
    struct ICONINFO {
        public bool fIcon;    
        public Int32 xHotspot;    
        public Int32 yHotspot;    
        public IntPtr hbmMask;    
        public IntPtr hbmColor;    
    }
    }

Alternative Managed API:

Do you know one? Please contribute it!

Documentation
GetIconInfo on MSDN