Изменение значка глобального курсора - PullRequest
0 голосов
/ 10 апреля 2020

У меня есть кнопка на WinForm (c#), и когда она нажата (мышь вниз, затем вверх), я бы хотел изменить курсор мыши на пользовательский значок. Мне бы хотелось, чтобы этот пользовательский значок курсора оставался независимо от положения мыши в области экрана (над исходным приложением, другими приложениями, рабочим столом и т. Д. c.) До тех пор, пока мышь не будет нажата (мышь вниз, затем вверх). После этого второго щелчка я хочу, чтобы курсор вернулся к своему поведению по умолчанию.

В настоящее время я использую метод глобальной ловушки мыши , описанный Дэном Силком (с поправкой от Ханса Пассанта) для захвата глобальных событий перемещения и щелчка мыши.

Я думаю, что мне нужно перехватить (и впоследствии остановить) сообщения WM_SETCURSOR (которые согласно Гансу следуют за любым движением мыши). Однако я не уверен, как это сделать для вещей, помимо исходного приложения, которое Реза Агаи выделил следующим образом:

const int WM_SETCURSOR = 0x0020;
protected override void WndProc(ref Message m)
{
    if (m.Msg == WM_SETCURSOR)
        Cursor.Current = myCustomCursor;
    else
        base.WndProc(ref m);
}

Когда я пытался использовать вышеописанный метод WndProc для настройки курсора только для исходного приложения у меня все еще мерцание курсора. Есть ли правильный способ остановить отправку / отправку сообщений WM_SETCURSOR?

Любая помощь или предложения будут наиболее полезны!


ОБНОВЛЕНИЕ

Я решил go решить мою проблему под другим углом, чтобы полностью не бороться с сообщениями WM_SETCURSOR. То, что у меня сейчас есть, работает нормально, однако, если там есть ответ, вы можете опубликовать его для будущих поколений.

1 Ответ

1 голос
/ 15 апреля 2020

Пара этих событий работает для меня глобально, независимо от того, какое приложение наведено мышью:

private static Cursor _customCursor = new Cursor(@"C:\path\Hand.cur");

private void button1_MouseDown(object sender, MouseEventArgs e)
{
    Cursor = _customCursor;
}

private void button1_MouseUp(object sender, MouseEventArgs e)
{
    Cursor = Cursors.Default;
}

Beer custom cursor outside the form

Соответствует ли оно вашим потребностям или упустили что-то важное здесь?

...