取消文本框发送mouselleave消息

本文关键字:mouselleave 消息 文本 取消 | 更新日期: 2023-09-27 18:05:13

是否有办法从文本框中取消WM_MOUSELEAVE消息?

我有另一个控件直接在它的顶部(我试图得到窗口绘制的边界)。我在该控件的MouseMove事件中手动调用WM_MOUSEMOVE,以使文本框周围的Aero蓝色边框亮起来。使用spy++,我看到它在发射WM_MOUSELEAVE,尽管我还在它的边界内。这将导致蓝色边框在闪烁中消失/重新出现。

编辑我尝试了@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);

取消文本框发送mouselleave消息

也许这就是你正在寻找的。这将要求您用tb替换TextBox定义,但也许有一个更优雅的方法。

    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);
                    }
                }
            }