¿Cómo cambiar el cursor del ratón a uno personalizado cuando se trabaja con aplicaciones de Windows Forms?


En un UserControl quiero cambiar el cursor del ratón de la flecha, a un icono de mano.
Lo que hago actualmente es esto:

this.Cursor = Cursors.Hand;

Esto es muy bonito, me da un cursor del ratón que se ve así:

introduzca la descripción de la imagen aquí

Pero aquí viene mi problema... esto muestra una mano con un dedo que señala.
Lo que necesito es una mano "agarrando", más como esta:

introduzca la descripción de la imagen aquí

¿Cómo hago esto?, ¿Cómo puedo cargar un archivo de icono (.ico), un archivo de cursor (.cur), o archivo de imagen (.png), y uso como el cursor del ratón?

Author: Shin, 2011-07-19

4 answers

Si tiene un archivo de cursor:

Cursor myCursor = new Cursor("myCursor.cur");
myControl.Cursor = myCursor;

De lo contrario tienes que crear uno:

Más información sobre cursores personalizados

 18
Author: fixagon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-19 07:32:35

¿has probado System.Windows.Forms.Cursor curs = new System.Windows.Forms.Cursor(file_name); ?

 2
Author: Djole,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-19 07:36:12

Una advertencia para usar cursores personalizados con la clase WinForms Cursor es que cuando se usa la secuencia, el nombre de archivo y el constructor de recursos sobrecargan el archivo .cur suministrado debe ser en blanco y negro en color.

Lo que significa que esto no funcionará si los archivos .cur contienen cualquier color además del blanco y negro.

Cursor myCursor = new Cursor("myCursor.cur");
myControl.Cursor = myCursor;

Hay una manera de evitar esta limitación mediante el uso del controlador de Windows sobrecarga del constructor:

Cree el handle usando las ventanas API:

[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern IntPtr LoadCursorFromFile(string fileName);

Luego pásalo al constructor apropiado Cursor así:

IntPtr handle = LoadCursorFromFile("myCursor.cur");
Cursor myCursor = new Cursor(handle);
myControl.Cursor = myCursor;

Espero que esto evita que otros rascándose la cabeza a un ArgumentException siendo lanzado diciendo: Image format is not valid. The image file may be corrupted. cuando se utiliza el otro Cursor sobrecargas del constructor con un .cur archivo que contiene el color.

 1
Author: Derek W,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-14 21:47:46

Probé este método. Está bien. Esta es mi solicitud:

    [System.Runtime.InteropServices.DllImport("user32.dll")]
    public static extern IntPtr LoadCursorFromFile(string fileName);
    Cursor myCursor;
    private void tsbtn_ZoomIn_Click(object sender, EventArgs e)
    {
        IntPtr handle = LoadCursorFromFile("view_zoom_in.cur");
        myCursor = new Cursor(handle);
        zg1.Cursor = myCursor;
    }
 0
Author: nult2003,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-25 06:10:46