0

我有几个控件(标签、自定义文本框、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!!!
        }
4

2 回答 2

3

Winforms 事件不会像在 WPF 或 Html 中那样冒泡。因此,如果控件停靠在窗体上,窗体不会暴露它自己的任何表面,也不会捕获任何鼠标事件。但是,在“水下”,所有 Windows 消息(鼠标移动是 Windows 消息)都会传递表单,因此可以捕获该消息。

编辑 Tigran 已链接到使用 IMessageFilter 的一个很好的示例,这使得创建另一个示例有点多余:)

于 2012-06-26T06:56:23.497 回答
2

造成这种情况的原因是WPF事件WindowsForms被处理它的控件“阻止”(WPF事件将被推送到父级到可视树,或者相反的方向:从父级到子级)。

因此,要捕获该事件,您需要在应用程序级别对其进行处理,并且不要订阅单个控制事件。

有关如何处理它的更详细示例,请参见此处:

如何在我的 winform 应用程序中捕获鼠标移动事件

于 2012-06-26T06:57:39.160 回答