如何防止其他鼠标按钮中断MouseMove?

时间:2011-08-27 19:11:08

标签: c# winforms event-handling mouse mouseevent

如果您将一个面板放在一个新的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。

有没有办法改变这个?谢谢你的阅读。

2 个答案:

答案 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,因此没有任何窗口。所以这意味着,就像一个简单的命令:你失去了对鼠标的捕获。

希望这有帮助。

Screenshot of local test