Ric*_*ral 7 c# mouseevent detection winforms
我需要检测用户何时将鼠标移动到Form及其所有子控件上以及何时离开Form.我尝试了表单的事件MouseEnter和MouseLeave事件,我尝试了WM_MOUSEMOVE&WM_MOUSELEAVE和WM_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)