试试这个:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
AddMouseMoveHandler(this);
}
private void AddMouseMoveHandler(Control c)
{
c.MouseMove += MouseMoveHandler;
if(c.Controls.Count>0)
{
foreach (Control ct in c.Controls)
AddMouseMoveHandler(ct);
}
}
private void MouseMoveHandler(object sender, MouseEventArgs e)
{
lblXY.Text = string.Format("X: {0}, Y:{1}", e.X, e.Y);
}
}
Run Code Online (Sandbox Code Playgroud)
我知道这篇文章已经很老了,但在我看来,最简单的方法是实现表单IMessageFilter.在构造函数(或OnHandleCreated)中调用
Application.AddMessageFilter(this);
Run Code Online (Sandbox Code Playgroud)
然后你可以在你的实现中捕获所有窗口的消息IMessageFilter.PreFilterMessage.
您可能需要将P/Invoke用于WIN32 IsChild方法
[DllImport("user32.dll")]
public static extern bool IsChild(IntPtr hWndParent, IntPtr hWnd);
Run Code Online (Sandbox Code Playgroud)
以及表单的Handle属性,以确保您正在处理正确的消息.
恕我直言,这里有一点二元的情况:并且没有“一行”。我能看到的唯一解决方案是将不实现事件的控件放入实现事件的 .NET 容器中。
当任何控件获得单击时,正常的预期行为是它将成为表单的活动控件(始终可以通过 this.ActivceControl 访问)。
但是,特别是如果您单击的控件捕获了鼠标,则必须引发事件,因为 .NET 不实现事件“冒泡”(如 WPF 那样)。
处理任何密封对象或其他对象的扩展行为的常用方法是编写扩展方法,我发现为 Control 编写扩展非常容易,但我不知道在这种情况下这是否会对您有帮助。不幸的是我现在不在我的祖国,并且没有 Visual Studio 可以使用。
可以用来确定窗体上的给定点是否落在任何控件的范围内的一种策略是通过“forall of the Forms Control.Collection (this.Controls)”枚举窗体上所有控件的区域(边界)。但是,如果您有重叠的控件,则会遇到多个控件可能包含给定点的问题。
最好的,比尔
| 归档时间: |
|
| 查看次数: |
15236 次 |
| 最近记录: |