如果您将一个面板放在一个新的C#项目中并像这样捕获它的MouseMove事件:
private void panel1_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button != MouseButtons.Left)
return;
Console.WriteLine("e.X: {0}, e.Y: {1}", e.X, e.Y);
}
它会在按住鼠标左键的同时告诉您鼠标的客户端坐标,即使光标移出面板也是如此。
但是,如果您在容器中按住鼠标左键,然后在按住鼠标左键的同时单击鼠标上的任何其他鼠标按钮,它将不再在容器边界外调用MouseMove。
有没有办法改变这个?谢谢你的阅读。
答案 0 :(得分:2)
1:如果您在左键按下时尝试 ,请尝试以下操作:
bool mouseDown = false;
private void panel1_MouseMove(object sender, MouseEventArgs e)
{
if (!mouseDown)
return;
Console.WriteLine("e.X: {0}, e.Y: {1}", e.X, e.Y);
}
private void panel1_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
mouseDown = true;
}
private void panel1_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
mouseDown = false;
}
2:否则,如果您想在任何鼠标按钮关闭时使用它,请尝试以下操作:
int mouseDown = 0;
private void panel1_MouseMove(object sender, MouseEventArgs e)
{
if (mouseDown == 0)
return;
Console.WriteLine("e.X: {0}, e.Y: {1}", e.X, e.Y);
}
private void panel1_MouseDown(object sender, MouseEventArgs e)
{
mouseDown++;
}
private void panel1_MouseUp(object sender, MouseEventArgs e)
{
mouseDown--;
}
答案 1 :(得分:0)
除了贾斯汀的解决方案之外,还会说:
我认为这是因为,如果在拖动过程中你离开面板右键单击面板的 out ,强制面板失去焦点,因此控制不再成为活动控制面板。
如果您在面板内拖动鼠标并右键单击面板内的,则会发生类似这样的事情。
我刚刚使用Spy ++ windows explorer捕获并进行了测试,所以用LButton向下移动鼠标,在某些时候没有释放它右键单击。这是一个结果:
使用箭头我用右键点击我点击的行,WM_CAPTURECHANGED 消息已发送。根据文档的这条消息是:
发送到丢失鼠标捕获的窗口。
用箭头查看下一行。下一个窗口的句柄为0,因此没有任何窗口。所以这意味着,就像一个简单的命令:你失去了对鼠标的捕获。
希望这有帮助。