[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);
Public Declare Function GetIconInfo Lib "user32" (ByVal hIcon As IntPtr, ByVal piconinfo As ICONINFO) As Boolean
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!