Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 即使未移动鼠标,PictureBox中的MouseMove事件也会持续激发_C#_.net_Winforms_Picturebox_Mousemove - Fatal编程技术网

C# 即使未移动鼠标,PictureBox中的MouseMove事件也会持续激发

C# 即使未移动鼠标,PictureBox中的MouseMove事件也会持续激发,c#,.net,winforms,picturebox,mousemove,C#,.net,Winforms,Picturebox,Mousemove,为什么PictureBox的MouseMove事件似乎在鼠标未移动的情况下持续触发? 我尝试了以下代码来证明这一点(只需创建一个带有PictureBox和标签的新表单) 第一个猜测。。。要么是地震活动,要么是纳格尔——我怀疑是纳格尔:) 使用您提供的代码示例,我不会得到相同的行为。我的标签仅在鼠标实际移动时更新。(指针必须在picturebox上才能启动) 但说真的。。。你的桌子上有震动吗?我可能还会尝试另一个鼠标,因为里面的电路可能会发送坏数据。“pictureBox1\u MouseMove

为什么PictureBox的MouseMove事件似乎在鼠标未移动的情况下持续触发? 我尝试了以下代码来证明这一点(只需创建一个带有PictureBox和标签的新表单)


第一个猜测。。。要么是地震活动,要么是纳格尔——我怀疑是纳格尔:)

使用您提供的代码示例,我不会得到相同的行为。我的标签仅在鼠标实际移动时更新。(指针必须在picturebox上才能启动)

但说真的。。。你的桌子上有震动吗?我可能还会尝试另一个鼠标,因为里面的电路可能会发送坏数据。

“pictureBox1\u MouseMove”只是一个委托函数。因此,对于您的代码,我们只能假设它已附加到MouseMove,并且在设计器中只有MouseMove

仔细检查“pictureBox1\u MouseMove”的所有引用,还要记住,即使您不移动鼠标,Windows也会在鼠标单击时触发MouseMove消息

最坏情况下,您可以将点e.位置存储在本地成员变量(“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;
    }
}

某些涉及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事件中查看以“深度”方式接触表单的内容可能有助于揭示循环行为的来源。

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

您的表单mousemove事件寄存器是否可以使用此方法?!“持续”就像“它一直在运行”一样,还是仅仅在一段时间内?事件是否不稳定?(如果是这样,请怀疑振动和鼠标过于敏感。)您可以尝试运行Spy++并监视Windows消息,以查看其他情况。如果您有Visual Studio,则其中一个工具文件夹中应该有spyxx.exe。此外,在调试时尝试物理拔下鼠标,看看是否仍收到MouseMove消息。我有机会在不同的PC上运行相同的代码,但它无法复制。第一台电脑一定出了问题。我会按照穆尔兹的建议尝试使用Spy++。谢谢斜桌?提醒我永远不要和你玩扑克:)我相信你可以把它缩短为
e.Location!=oldLocation
。+1关于确保代理连接到正确事件的正确调用。不,我通过在标签中显示e.X和e.Y来确保鼠标位置不会改变,但奇怪的是,标签中的时间信息以每秒一次的速度变化。其他信息:在Vista SP2上使用VS 2008 SP1。可能是我电脑中的Windows/VS/.NET错误吗?
int moveCount = 0;
private void form1_MouseMove(object sender, MouseEventArgs e)
{
    Trace.WriteLine(moveCount);
    moveCount++;
}