我在窗体上停靠了很少的控件(Label,Custom Textbox,Datagridview)。当我尝试将MouseMove事件挂钩到各个控件时,事件触发完全正常但是当我尝试将事件挂钩到表单本身时,mousemove事件根本不响应。可能的原因是什么?
编辑:
这是来自resources.cs的事件挂钩
this.MouseMove += new System.Windows.Forms.MouseEventHandler(this.LogicSimulationViewerForm_MouseMove);
这是捕获事件处理的函数
private void LogicSimulationViewerForm_MouseMove(object sender, MouseEventArgs e)
{
//DOESN'T WORK!!!
}
答案 0 :(得分:3)
Winforms事件不像WPF或Html中那样冒泡。因此,如果控件停靠在窗体上,窗体不会暴露它自己的任何表面,也不会捕获任何鼠标事件。然而,“在水下”,所有窗口消息(鼠标移动都是Windows消息),确实传递了表单,因此可以捕获该消息。
修改强> Tigran有linked作为使用IMessageFilter的一个很好的例子,这使得创建另一个例子有点多余:)
答案 1 :(得分:2)
原因是,WPF
中WindowsForms
的差异导致事件被处理它的控件“阻止”(在WPF
中,事件将被推送到父级直到视觉树,或相反的方向:从父母到孩子。)
因此,要捕获该事件,您需要在应用程序级别处理它,并且不订阅单个控件事件。
有关如何处理它的更详细示例,请查看此处:
How do I capture the mouse mouse move event in my winform application