即使未移动鼠标,PictureBox中的MouseMove事件也会连续触发

时间:2011-12-12 23:16:10

标签: c# .net winforms picturebox mousemove

为什么即使鼠标没有移动,PictureBox的MouseMove事件似乎也会连续触发? 我已经尝试了以下代码来证明它(通过简单地创建一个带有PictureBox和Label的新表单)。

private void pictureBox1_MouseMove ( object sender, MouseEventArgs e )
{
  label1.Text = DateTime.Now.ToLongTimeString ( ) + ": " + e.X + "," + e.Y;
}

4 个答案:

答案 0 :(得分:4)

某些涉及窗体形式的方法会导致窗体的某种程度的内部刷新,这(根据我的估计)会导致窗体“拾取”鼠标位置,从而触发MouseMove事件。一种这样的方法是将工具提示与表单相关联。结果,

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事件内部以“深入”方式触摸表单的内容可能有助于揭示循环行为的来源。

答案 1 :(得分:2)

“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;
    }
}

答案 2 :(得分:1)

首先猜测......无论是地震活动还是谜团 - 我怀疑是傻笑:)。

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

但严重的是......你的桌子上有振动吗?我也可能尝试另外一个鼠标 - 因为里面的电路可能会发送错误的数据。

答案 3 :(得分:0)

观察:如果MouseMove事件处理程序代码沿任一方向修改了控件的大小(通过AutoSize属性显式或隐式),则即使没有实际的鼠标移动,也会重新调用MouseMove事件处理程序。这可能导致恶性循环。如果自动尺寸控件的宽度已更改,但其宽度仍然稳定,则不会重新调用MouseEvent处理程序。