从发送MouseLeave消息中取消文本框

时间:2011-08-09 14:43:20

标签: c# .net winforms winapi pinvoke

有没有办法可以从文本框中取消WM_MOUSELEAVE消息?

我有另一个控件直接在它上面(我正试图获得Windows绘制的边框)。我在该控件的WM_MOUSEMOVE事件中手动调用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);

1 个答案:

答案 0 :(得分:1)

也许这就是你要找的东西。它需要您将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);
                    }
                }
            }