【问题标题】:C# Form not catching any mouse eventC# Form 没有捕捉到任何鼠标事件
【发布时间】:2012-06-26 15:09:43
【问题描述】:

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

【问题讨论】:

  • 它仅在您单击表单本身时触发,而不是其元素。
  • 我说的是 mousemove 不是 mousedown
  • 您应该创建 minimal 不起作用的示例代码并用它更新您的问题。没有源代码,任何人都无法帮助您。
  • 老实说,我不确定为什么您需要 minimal 示例代码来处理可笑的琐碎,但我不是抱怨,所以我会编辑我的问题。

标签: c# .net winforms events


【解决方案1】:

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

编辑 Tigran 有linked 是使用 IMessageFilter 的一个很好的例子,这使得创建另一个例子有点多余:)

【讨论】:

  • 那我该如何处理这个消息呢?
【解决方案2】:

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

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

关于如何处理的更详细的例子可以看这里:

How do I capture the mouse mouse move event in my winform application

【讨论】:

  • 那么有没有办法绕过“块”?
猜你喜欢
  • 2012-10-07
  • 1970-01-01
  • 2011-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-03
相关资源
最近更新 更多