整个窗口上的MouseHover/MouseLeave事件

bil*_*lpg 9 c# events mouseleave winforms mousehover

我有Form子类,带有处理程序MouseHoverMouseLeave.当指针位于窗口的背景上时,事件工作正常,但当指针移动到窗口的控件上时,它会引发MouseLeave事件.

无论如何有一个覆盖整个窗口的事件.

(.NET 2.0,Visual Studio 2005,Windows XP.)

小智 8

只要鼠标进入子控件,就不会触发MouseLeave事件

    protected override void OnMouseLeave(EventArgs e)
    {
        if (this.ClientRectangle.Contains(this.PointToClient(Control.MousePosition)))
            return;
        else
        {
            base.OnMouseLeave(e);
        }
    }
Run Code Online (Sandbox Code Playgroud)


Han*_*ant 6

没有好的方法可以使MouseLeave可靠地用于容器控件.用计时器解决这个问题:

public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();
        timer1.Interval = 200;
        timer1.Tick += new EventHandler(timer1_Tick);
        timer1.Enabled = true;
    }

    private bool mEntered;

    void timer1_Tick(object sender, EventArgs e) {
        Point pos = this.PointToClient(Cursor.Position);
        bool entered = this.ClientRectangle.Contains(pos);
        if (entered != mEntered) {
            mEntered = entered;
            if (!entered) {
                // Do your leave stuff
                //...
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Sho*_*ban 6

当鼠标离开事件被触发时,一个选项是检查指针的当前位置并查看它是否在表单区域内.我不确定是否有更好的选择.

编辑:我们有一个类似的问题,您可能会感兴趣.如何检测鼠标是否在C#中的整个表单和子控件内?