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);
}
你看到的是标准行为。这是在按住鼠标时获取对象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
以找出在需要时按下了哪些鼠标按钮。