【问题标题】:MouseMove event in PictureBox is fired continuously even if the mouse is not moved即使鼠标没有移动,PictureBox 中的 MouseMove 事件也会连续触发
【发布时间】:2011-12-12 23:16:09
【问题描述】:

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

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

【问题讨论】:

  • 可能是你的表单mousemove事件注册了这个方法?!
  • “持续”如“一直运行”或仅在特定时间段内?事件是否不稳定? (如果是这样,怀疑是振动和过度敏感的鼠标。)
  • 您可以尝试运行 Spy++ 并监视 Windows 消息以尝试查看其他情况。如果你有 Visual Studio,它应该在工具文件夹之一中有 spyxx.exe。此外,在调试时尝试物理拔掉鼠标,看看是否仍然收到 MouseMove 消息。
  • 我有机会在不同的 PC 上运行相同的代码,但它无法重现。第一台 PC 一定有问题。我将尝试按照 Moohze 的建议使用 Spy++。谢谢!
  • 斜桌?提醒我永远不要和你玩扑克:)

标签: c# .net winforms picturebox mousemove


【解决方案1】:

某些涉及 windows 窗体的方法会导致窗体的某种程度的内部刷新,这(据我估计)会导致窗体“拾取”鼠标位置,从而触发 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 事件中查看以“深度”方式接触表单的内容可能有助于揭示循环行为的来源。

【讨论】:

    【解决方案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;
        }
    }
    

    【讨论】:

    • 我相信您也可以将其缩短为e.Location != oldLocation
    • + 1 个很好的电话,确保代表连接到正确的事件。
    【解决方案3】:

    第一个猜测...地震活动或 nargles - 我怀疑 nargles :)。

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

    但是说真的……你的桌子有震动吗?我也可以试试其他鼠标——因为里面的电路可能会发送错误的数据。

    【讨论】:

    • 不,我通过在标签中显示 e.X 和 e.Y 来确保鼠标位置不会改变,但奇怪的是标签中的时间信息以每秒一次的速度变化。附加信息:在 Vista SP2 上使用 VS 2008 SP1。会不会是我 PC 中的 Windows/VS/.NET 错误?
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-08
      • 1970-01-01
      • 2012-02-04
      • 2014-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多