CreateIconFromResource (user32)
Last changed: -94.233.13.80

.
Summary

C# Signature:

[DllImport("user32.dll")]
static extern IntPtr CreateIconFromResource(byte[] presbits, uint dwResSize, bool fIcon, uint dwVer);

[DllImport("user32.dll")]
static extern IntPtr CreateIconFromResource(IntPtr presbits, int dwResSize, bool fIcon, int dwVer);

VB.NET Signature:

<DllImport("user32.dll")> _
Private Shared Function CreateIconFromResource(presbits As Byte(), dwResSize As UInteger, fIcon As Boolean, dwVer As UInteger) As IntPtr
End Function

User-Defined Types:

Existing Methods Modified

Notes:

Awesome Example, Powerful and Accurate Representation

Yvan say this about this example:

Why I posted this example: I looked and found no working examples

I modified what I found to get a working example, this works ok

This is not a complete invention of the class, simply a working example I produced !!!

Tips & Tricks:

See below for 3 examples loaded & embedded mouse cursors examples

Sample Code:

added by Yvan Genesse

Example 3 by TOM_RUS

Alternative Managed API:

Solved by Yvan Genesse Nov. 28, 2010

Documentation

Example 1

// used for loading animated mouse cursors from file loading example provided below
// in my new improved class AdvancedCursorsFromEmbededResources

// this is a previously known released class item
/*
    // in your form C#
    try
    {
        // from file
        this.Cursor = AdvancedCursors.Create(Path.Combine(Application.StartupPath, "flower_anim.ani"));
    }
    catch (Exception err)
    {
        MessageBox.Show(err.Message);
    }
*/

public class AdvancedCursors
{
    [DllImport("User32.dll")]
    private static extern IntPtr LoadCursorFromFile(String str);

    public static Cursor Create(string filename)
    {
        IntPtr hCursor = LoadCursorFromFile(filename);

        if (!IntPtr.Zero.Equals(hCursor))
        {
            return new Cursor(hCursor);
        }
        else
        {
            throw new ApplicationException("Could not create cursor from file " + filename);
        }
    }
}

Example 2

// from resources   modification here is :   byte[] variable resource in the call
// modified class by Yvan Genesse
public class AdvancedCursorsFromEmbededResources
{
    // modified by Yvan Genesse November 29 2010

    // C# example tested in MS Visual Studio 2010 Ultimate version
    // University Student in E-Business @ Laurentian University

    // in your form code
/*
    try
    {
        // from file
        //this.Cursor = AdvancedCursors.Create(Path.Combine(Application.StartupPath, "flower_anim.ani"));
        // from resouces   modification here is :   byte[] resource in the call
        byte[] Embeded_Cursor_Resource = Properties.Resources.flower_anim;  // the animate cursor desired
        this.Cursor = AdvancedCursorsFromEmbededResources.Create(Embeded_Cursor_Resource);

        // or this way also works
        this.Cursor = AdvancedCursorsFromEmbededResources.Create(Properties.Resources.flower_anim);
    }
    catch (Exception err)
    {
        MessageBox.Show(err.Message);
    }
*/

    [DllImport("user32.dll")]
    static extern IntPtr CreateIconFromResource(byte[] presbits, uint dwResSize, bool fIcon, uint dwVer);

    // modification here is :   byte[] resource in the call      
    public static Cursor Create( byte[] resource)
    {
        IntPtr myNew_Animated_hCursor;

        //byte[] resource = Properties.Resources.flower_anim;

        myNew_Animated_hCursor = CreateIconFromResource(resource, (uint)resource.Length, false, 0x00030000);

        if (!IntPtr.Zero.Equals(hCursor))
        {
            // all is good
            return new Cursor(myNew_Animated_hCursor);
        }
        else
        {
            // resource wrong type or memory error occurred
            // normally this resource exists since you had to put  Properties.Resources. and a resource would appear and you selected it
            // the animate cursor desired  is the error generator since this call is not required for simple cursors

            throw new ApplicationException("Could not create cursor from Embedded resource ");
        }        
    }    
}

Example 3 - Load *.cur file from resources, requires enabling unsafe code

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace EmbedCursorTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            byte[] cross_i = Properties.Resources.cross_i; // *.cur file embedded into resources

            this.Cursor = cross_i.CursorFromArray(0);
        }
    }

    public static class Extensions
    {
        [StructLayout(LayoutKind.Explicit, Pack = 1)]
        struct IconHeader
        {
            [FieldOffset(0)]
            public short reserved;
            [FieldOffset(2)]
            public short type;
            [FieldOffset(4)]
            public short count;
        }

        [StructLayout(LayoutKind.Explicit, Pack = 1)]
        struct IconInfo
        {
            [FieldOffset(0)]
            public byte width;
            [FieldOffset(1)]
            public byte height;
            [FieldOffset(2)]
            public byte colors;
            [FieldOffset(3)]
            public byte reserved;
            [FieldOffset(4)]
            public short planes; // ICO file
            [FieldOffset(6)]
            public short bpp; // ICO file
            [FieldOffset(4)]
            public short hotspot_x; // CUR file
            [FieldOffset(6)]
            public short hotspot_y; // CUR file
            [FieldOffset(8)]
            public int size;
            [FieldOffset(12)]
            public int offset;
        }

        [DllImport("user32.dll", SetLastError = true)]
        static extern IntPtr CreateIconFromResource(IntPtr pbIconBits, int dwResSize, bool fIcon, int dwVer);

        public static unsafe Cursor CursorFromArray(this byte[] data, int imageIndex)
        {
            fixed (byte* pData = data)
            {
                IconHeader* iHeader = (IconHeader*)pData;

                if (imageIndex > iHeader->count - 1)
                    throw new ArgumentOutOfRangeException("imageIndex");

                IconInfo* iInfo = (IconInfo*)(pData + sizeof(IconHeader) + imageIndex * sizeof(IconInfo));

                IntPtr iconImage = Marshal.AllocHGlobal(iInfo->size + 4);
/*wiki bug*/    *(short*)(iconImage + 0) = iInfo->hotspot_x;
/*wiki bug*/    *(short*)(iconImage + 2) = iInfo->hotspot_y;
                Marshal.Copy(data, iInfo->offset, iconImage + 4, iInfo->size);

                IntPtr hCursor = CreateIconFromResource(iconImage, iInfo->size + 4, false, 0x30000);
                Marshal.FreeHGlobal(iconImage);

                return new Cursor(hCursor);
            }
        }

        // same as above, but without pointers
        public static Cursor CursorFromArrayManaged(this byte[] data, int imageIndex)
        {
            GCHandle handle = GCHandle.Alloc(data, GCHandleType.Pinned);

            IconHeader iHeader = (IconHeader)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(IconHeader));

            if (imageIndex > iHeader.count - 1)
            {
                handle.Free();
                throw new ArgumentOutOfRangeException("imageIndex");
            }

            IntPtr iconInfoPtr = handle.AddrOfPinnedObject() + Marshal.SizeOf(typeof(IconHeader)) + imageIndex * Marshal.SizeOf(typeof(IconInfo));
            IconInfo iInfo = (IconInfo)Marshal.PtrToStructure(iconInfoPtr, typeof(IconInfo));

            handle.Free();

            IntPtr iconImage = Marshal.AllocHGlobal(iInfo.size + 4);
            Marshal.WriteInt16(iconImage + 0, iInfo.hotspot_x);
            Marshal.WriteInt16(iconImage + 2, iInfo.hotspot_y);
            Marshal.Copy(data, iInfo.offset, iconImage + 4, iInfo.size);

            IntPtr hCursor = CreateIconFromResource(iconImage, iInfo.size + 4, false, 0x30000);
            Marshal.FreeHGlobal(iconImage);
            return new Cursor(hCursor);
        }
    }
}