如何检测鼠标是否在整个表单和子控件内?

Ric*_*ral 7 c# mouseevent detection winforms

我需要检测用户何时将鼠标移动到Form及其所有子控件上以及何时离开Form.我尝试了表单的事件MouseEnterMouseLeave事件,我尝试了WM_MOUSEMOVE&WM_MOUSELEAVEWM_NCMOUSEMOVE&WM_NCMOUSELEAVE对Windows消息,但似乎没有任何工作,因为我想...

我的大部分表格都被各种各样的儿童控件占据,可见的客户区域不多.这意味着如果我非常快速地移动鼠标,则不会检测到鼠标移动,尽管鼠标位于窗体内.

例如,我有一个停靠在底部,桌面和TextBox之间的TextBox,只有一个非常小的边框.如果我快速将鼠标从底部移动到TextBox中,则不会检测到鼠标移动,但鼠标位于TextBox内部,因此位于Form内部.

我怎样才能达到我的需要?

TcK*_*cKs 13

您可以挂钩主消息循环并预处理/后处理您想要的任何(WM_MOUSEMOVE)消息.

public class Form1 : Form {
    private MouseMoveMessageFilter mouseMessageFilter;
    protected override void OnLoad( EventArgs e ) {
        base.OnLoad( e );

        this.mouseMessageFilter = new MouseMoveMessageFilter();
        this.mouseMessageFilter.TargetForm = this;
        Application.AddMessageFilter( this.mouseMessageFilter );
    }

    protected override void OnClosed( EventArgs e ) {
        base.OnClosed( e );

        Application.RemoveMessageFilter( this.mouseMessageFilter );
    }

    class MouseMoveMessageFilter : IMessageFilter {
        public Form TargetForm { get; set; }

        public bool PreFilterMessage( ref Message m ) {
            int numMsg = m.Msg;
            if ( numMsg == 0x0200 /*WM_MOUSEMOVE*/) {
                this.TargetForm.Text = string.Format( "X:{0}, Y:{1}", Control.MousePosition.X, Control.MousePosition.Y );
            }

            return false;
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我不确定,你究竟想要什么.IMessageFilter是非常常见的接口,几乎可用于任何与Windows消息传递系统相关的内容.在互联网上有大量的样本和教程.我没有关于它的其他知识,可以在教程中找到. (2认同)