如何捕获子控件下的mousemove事件

Gra*_*ant 5 c# events handle mousemove winforms

我试图在特定表格上处理鼠标点击事件,如果鼠标光标落在一组坐标之间,则应触发该事件 - 比方说.

我明白,如果我有一个空的表格,我可以简单地绑定到mousemove事件,然后离开.但实际上可能有多达10个不同的重叠控件,在我的测试应用程序中,mousemove事件仅在光标位于实际表单本身时触发,而不是在其通过子控件时触发.

当设计时存在未知数量的子控件时,是否有人知道如何处理此事件?

我可以使用简单的单行程吗?

The*_*iot 7

试试这个:

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)

  • 很高兴你没有删除你的帖子虽然OP想要别的东西.在我的情况下帮助了我. (3认同)

str*_*000 7

我知道这篇文章已经很老了,但在我看来,最简单的方法是实现表单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属性,以确保您正在处理正确的消息.


Bil*_*llW 0

恕我直言,这里有一点二元的情况:并且没有“一行”。我能看到的唯一解决方案是将不实现事件的控件放入实现事件的 .NET 容器中。

当任何控件获得单击时,正常的预期行为是它将成为表单的活动控件(始终可以通过 this.ActivceControl 访问)。

但是,特别是如果您单击的控件捕获了鼠标,则必须引发事件,因为 .NET 不实现事件“冒泡”(如 WPF 那样)。

处理任何密封对象或其他对象的扩展行为的常用方法是编写扩展方法,我发现为 Control 编写扩展非常容易,但我不知道在这种情况下这是否会对您有帮助。不幸的是我现在不在我的祖国,并且没有 Visual Studio 可以使用。

可以用来确定窗体上的给定点是否落在任何控件的范围内的一种策略是通过“forall of the Forms Control.Collection (this.Controls)”枚举窗体上所有控件的区域(边界)。但是,如果您有重叠的控件,则会遇到多个控件可能包含给定点的问题。

最好的,比尔