取消文本框发送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);
也许这就是你正在寻找的。这将要求您用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);
}
}
}