C# Winform - 保持鼠标按下并连接到其他对象,对象 MouseMove 不起作用

本文关键字:对象 其他 连接 不起作用 MouseMove Winform 鼠标 | 更新日期: 2023-09-27 17:55:23

当鼠标按下对象A然后鼠标移动到对象B时,对象B(鼠标移动句柄)无法调用。

如何让其他对象检测鼠标移动手柄,当鼠标按下时进入对象区域。

    public Test()
    {
        InitializeComponent();
        this.Size = new Size(500, 500);
        Panel pl = new Panel();
        pl.Size = new Size(200, 200);
        pl.Location = new Point(0, 0);
        pl.BackColor = Color.Pink;
        Label lb = new Label();
        lb.Text = "Keep MouseDown and move to Panel2 , Panel2 MouseMoveHandler not work";
        lb.Dock = DockStyle.Fill;
        pl.Controls.Add(lb);
        TextBox tb = new TextBox();
        tb.Multiline = true;
        tb.Size = new Size(400, 100);
        tb.Location = new Point(0,300);
        Panel pl2 = new Panel();
        pl2.Size = new Size(100, 100);
        pl2.Location = new Point(0, 0);
        pl2.BackColor = Color.Red;
        pl2.Location = new Point(300, 0);
        pl2.MouseMove += new MouseEventHandler(delegate (object o, MouseEventArgs a)
        {
            tb.AppendText(a.X + "," + a.Y);
        });
        this.Controls.Add(pl);
        this.Controls.Add(pl2);
        this.Controls.Add(tb);
    }

C# Winform - 保持鼠标按下并连接到其他对象,对象 MouseMove 不起作用

你看到的是标准行为。这是在按住鼠标时获取对象MouseMove事件的唯一方法,如果将鼠标移到该对象之外。

如果要找出在任何时间点光标下的控件(如果需要,可以在MouseMove事件中执行此操作),可以使用以下代码:

[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern IntPtr WindowFromPoint(Point pnt);
public static Control GetControlUnderCursor() {
  var handle = WindowFromPoint(Control.MousePosition);
  if (handle != IntPtr.Zero)
    return Control.FromHandle(handle);
  return null;
}

如果将窗体的 Capture 属性设置为 true(这是按住鼠标按钮时控件上发生的情况),则可以在窗体的 MouseMove 事件中使用此代码,并且可以检查Control.MouseButtons以找出在需要时按下了哪些鼠标按钮。