Cursors.Hand не отображает курсор выбора ссылки

У меня есть следующий код в моем проекте для изменения курсора мыши, когда пользователь наводит курсор на настраиваемую кнопку:

protected override void OnMouseEnter(EventArgs e)
{
    this.Cursor = Cursors.Hand;
    base.OnMouseEnter(e);
}

protected override void OnMouseLeave(EventArgs e)
{
    this.Cursor = Cursors.Default;
    base.OnMouseLeave(e);
}

Это работает нормально, за исключением того, что отображаемый курсор является стандартным белым курсором в виде руки. Но в свойствах мыши в Windows XP я установил курсор Link Select в виде анимированной цветной стрелки.

Чтобы исследовать проблему, я установил анимированную стрелку в качестве курсора Busy в свойствах мыши и изменил код в OnMouseEnter на:

this.Cursor = Cursors.WaitCursor;

Это работает, как я и ожидал, и стрелка была показана.

Похоже, что Cursors.Hand не соответствует курсору Link Select в свойствах мыши. Но я не могу найти ничего более подходящего для использования в классе Cursors. Что я делаю неправильно?


person Henrik Ripa    schedule 27.08.2010    source источник


Ответы (1)


Платформа .NET предоставляет собственный курсор для Cursor.Hand; он не загружает выбранный пользователем курсор из операционной системы.

Я могу только предположить, что это связано с тем, что Windows NT 4, на которой будет работать .NET, не поддерживает курсор в виде руки. Эта функция была добавлена ​​в Windows 98 и 2000. Приложения, предназначенные для Windows 95 или NT 4, предоставляют собственный курсор в виде руки, если он им нужен.

Хорошей новостью является то, что обходной путь относительно прост. Это довольно небольшой объем взаимодействия. Вам просто нужно использовать LoadCursor с IDC_HAND, а затем передать возвращенный дескриптор конструктору класса Cursor.

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

class Form1 : Form{
    enum IDC{
        HAND = 32649,
        // other values omitted
    }

    [DllImport("user32.dll", CharSet=CharSet.Auto)]
    static extern IntPtr LoadCursor(IntPtr hInstance, IDC cursor);

    public Form1(){
        Cursor = new Cursor(LoadCursor(IntPtr.Zero, IDC.HAND));
    }
}
person P Daddy    schedule 27.08.2010