[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);
None.
None.
Please add some!
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;
}
}
Do you know one? Please contribute it!