Изменить курсор в заголовке окна - PullRequest
1 голос
/ 26 июня 2011

У меня есть WinForm, и теперь мне нужно изменить курсор, когда он находится в заголовке окна. У меня есть код работает, у него есть 2 проблемы:

  1. Он также меняет курсор, когда находится по краям (должен быть показан курсор нормального размера). Я обнаружил, что мне нужно что-то вроде WM_NCHITTEST & HTTOP, но как мне это объединить?
  2. При перемещении мыши наблюдается мерцание.

Я также попытался разместить код под base.WndProc(ref m);.

Это код, который у меня уже есть:

if ((m.Msg == Win32.WM.NCMOUSEMOVE
    || m.Msg == Win32.WM.NCLBUTTONDOWN || m.Msg == Win32.WM.NCLBUTTONUP
    || m.Msg == Win32.WM.NCRBUTTONDOWN || m.Msg == Win32.WM.NCRBUTTONUP)
)
{
    if (m.WParam.ToInt32() != Win32.HT.TOP && m.WParam.ToInt32() != Win32.HT.RIGHT && m.WParam.ToInt32() != Win32.HT.BOTTOM && m.WParam.ToInt32() != Win32.HT.LEFT)
    {
        Cursor = Cursors.Hand;
    }
}

EDIT:
Я не регистрировал сообщение правильно в Spy ++. Нашел решение по краям окна (см. Обновленный код).

Thnx, J

1 Ответ

5 голосов
/ 26 июня 2011

Мерцает, потому что вы используете неправильное сообщение.За любым движением мыши следует WM_SETCURSOR, чтобы приложение могло изменить курсор.Таким образом, курсор вернется к значению по умолчанию.Вместо этого перехватите WM_SETCURSOR.Младшее слово LParam содержит код проверки попадания.

    protected override void WndProc(ref Message m) {
        if (m.Msg == 0x20) {  // Trap WM_SETCUROR
            if ((m.LParam.ToInt32() & 0xffff) == 2) { // Trap HTCAPTION
                Cursor.Current = Cursors.Hand;
                m.Result = (IntPtr)1;  // Processed
                return;
            }
        }
        base.WndProc(ref m);
    }
...