Отменить текстовое поле от отправки сообщений MouseLeave - PullRequest
0 голосов
/ 09 августа 2011

Можно ли отменить сообщение WM_MOUSELEAVE из текстового поля?

У меня есть еще один элемент управления прямо над ним (я пытаюсь получить нарисованную Windows границу).Я вручную вызываю WM_MOUSEMOVE в событии MouseMove этого элемента управления, чтобы синяя рамка Aero вокруг текстового поля загорелась.Используя Spy ++, я вижу его запуск WM_MOUSELEAVE, хотя я все еще в его границах.Это приводит к исчезновению / повторному появлению синей границы в мерцании.

edit Я попытался ответить @ Jeroen, и это уменьшило мерцание, но я по-прежнему не могу держать свечение или оно застреваетслишком долго.

        if (m.Msg == (int)Win32Api.WindowsMessages.MouseLeave)
        {
            var mousePosition = PointToClient(MousePosition);
            if (mousePosition.X < 0 || mousePosition.X > Width ||
                mousePosition.Y < 0 || mousePosition.Y > Height)
                base.WndProc(ref m);
            return;
        }

        base.WndProc(ref m);

1 Ответ

1 голос
/ 09 августа 2011

Может быть, это то, что вы ищете.Вам потребуется заменить определение TextBox на tb, но, возможно, есть более элегантный способ.

    public class tb : TextBox
            {

                private const int  WM_MOUSELEAVE = 0x02A3;

                protected override void WndProc(ref Message m)
                {
                    if (m.Msg == WM_MOUSELEAVE)
                    {
                        // not passing the message on, so does nothing.
                        // handle it yourself here or leave empty.
                    }
                    else
                    {
                        // otherwise let windows handle the message
                        base.WndProc(ref m);
                    }
                }
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...