即使鼠标没有移动,PictureBox中的MouseMove事件仍然会持续触发

6
为什么即使鼠标没有移动,PictureBox的MouseMove事件似乎也会不断触发? 我已经尝试了以下代码来证明这一点(通过简单地创建一个带有PictureBox和Label的新窗体)。
private void pictureBox1_MouseMove ( object sender, MouseEventArgs e )
{
  label1.Text = DateTime.Now.ToLongTimeString ( ) + ": " + e.X + "," + e.Y;
}

也许你的表单的mousemove事件注册了这个方法?! - Reza ArabQaeni
持续运行时是否一直如此,还是只在某个时间段内?事件是否不稳定?(如果是这样,可能是振动和过于敏感的鼠标引起的。) - Ry-
2
你可以尝试运行Spy++并监视Windows消息,以尝试查看发生了什么其他情况。如果你有Visual Studio,它应该在一个Tools文件夹中有spyxx.exe。此外,在调试时尝试物理拔出鼠标,并查看是否仍在接收MouseMove消息。 - Trevor Elliott
我有机会在不同的电脑上运行相同的代码,但无法再现。第一台电脑肯定有问题。我将尝试使用Moohze建议的Spy ++。谢谢! - Setyo N
斜桌子?提醒我不要跟你打扑克 :) - Jeremy Thompson
4个回答

5
某些与Windows表单相关的方法会导致该表单在内部进行一定程度的刷新,这可能会导致表单“捕捉”到鼠标位置并因此触发MouseMove事件。其中一种方法是将工具提示(tooltip)与表单关联起来。因此,
int moveCount = 0;
ToolTip toolTip = new ToolTip();
private void form1_MouseMove(object sender, MouseEventArgs e)
{
    Trace.WriteLine(moveCount);
    moveCount++;
    toolTip.SetToolTip(this, "Hello world");
}

即使鼠标没有移动,也会不断触发,而且…
int moveCount = 0;
private void form1_MouseMove(object sender, MouseEventArgs e)
{
    Trace.WriteLine(moveCount);
    moveCount++;
}

只有当鼠标实际移动时,事件才会触发。

检查MouseMove事件中与窗体有关的代码,可能有助于找出循环行为的来源。


4
"

\"pictureBox1_MouseMove\"是一个委托函数。因此,根据您的代码,我们只能假设它被附加到了设计器中的MouseMove事件上,且仅限于MouseMove事件。

请仔细检查所有关于\"pictureBox1_MouseMove\"的引用,并记住,即使您没有移动鼠标,Windows也会在鼠标单击时触发MouseMove消息。

最坏的情况是,您可以将Point e.Location存储在本地成员变量(\"oldLocation\")中,并在处理命令之前验证鼠标是否实际移动了:

"
private Point oldLocation = Point.Empty;

private void pictureBox1_MouseMove ( object sender, MouseEventArgs e )
{
    if (e.Location != oldLocation)
    {
        oldLocation = e.Location;

        label1.Text = DateTime.Now.ToLongTimeString ( ) + ": " + e.X + "," + e.Y;
    }
}

1
我相信你也可以把它缩短为 e.Location != oldLocation - Ry-
  • 在确保委托正确连接到事件方面,你做得很好。
- RThomas

1

第一次猜测...可能是地震活动或者娜尔格 - 我怀疑是娜尔格 :).

使用您提供的代码示例,我没有得到相同的行为。只有当鼠标实际移动时,我的标签才会更新。(而且指针还必须在图片框上)

但说真的...你的桌子上有任何震动吗?我也可以尝试另一个鼠标 - 因为内部电路可能会发送错误数据。


1
不,我通过在标签中显示e.X和e.Y来确保鼠标位置不会改变,但奇怪的是标签中的时间信息以每秒一次的速率改变。附加信息:在Vista SP2上使用VS 2008 SP1。这可能是我的PC上的Windows/VS/.NET错误吗? - Setyo N

0
观察到:如果MouseMove事件处理程序代码在任一方向上显式或隐式地修改控件的大小(根据AutoSize属性),则会重新调用MouseMove事件处理程序,尽管没有实际的鼠标移动。这可能导致恶性循环。如果自动调整大小的控件的宽度尽管其内容已更改但仍保持稳定,那么MouseEvent处理程序将不会被重新调用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接