【问题标题】:How to precisely track the mouse cordinates without skips如何在不跳过的情况下精确跟踪鼠标坐标
【发布时间】:2012-10-28 00:28:33
【问题描述】:

我需要一种比这段代码更精确地跟踪鼠标坐标的方法。如果您运行此代码并快速移动鼠标或快速改变方向,则坐标可能如下所示:50 和 40。似乎当鼠标快速移动时,它不会跟踪指针覆盖的所有点,如下所示例如,它跳过了 10 个坐标。如果我慢慢移动它,没有问题。我需要一种方法来跟踪所有指针坐标而不会跳过。我已经在使用全局钩子的 Code Project 上尝试了示例,结果相同。我怎样才能做到这一点?是否可以进行注册表更改以强制窗口跟踪所有坐标。可能吗?我更喜欢用 C# 来做,但也会考虑其他方式。谢谢。

private void Form1_MouseMove(object sender, MouseEventArgs e)
{
    if (num != 1)
    {
        listBox1.Items.Add(e.X.ToString());

    }
}

【问题讨论】:

  • 嗯,问题在于“跳过”发生在甚至在信号到达您的计算机之前。你需要插值。哦,不介意知道为什么
  • 因为我需要将鼠标保持在一个确定的区域,即使是一点点也不能逃脱

标签: c# windows registry mouse


【解决方案1】:

您确定鼠标覆盖了从 A 到 B 的旅程中的所有坐标吗?

来自操作系统的鼠标输入是经过采样的、谨慎的数据。这意味着鼠标指针可以跳过坐标,正如您所看到的。

如果数据不够高分辨率,请考虑对数据进行插值。

IIRC,您可以提高鼠标的采样率。不记得怎么了。我相信网络可以。

【讨论】:

    【解决方案2】:

    鼠标指针不会在每个像素上移动,如果你快速移动鼠标,它会在事件之间移动一大堆像素。硬件不会为鼠标移动的每个像素发送信号,它会报告自上次报告以来鼠标移动的距离。

    不要试图跟踪鼠标的位置,而是使用Cursor.Clip 属性来限制鼠标的移动:

    var rect = someControl.RectangleToScreen(new Rectangle(Point.Empty, someControl.ClientSize));
    Cursor.Position = new Point(rect.Left + rect.Width / 2, rect.Top + rect.Height / 2);
    Cursor.Clip = rect;
    

    使用空矩形释放鼠标:

    Cursor.Clip = new Rectangle(0, 0, 0, 0);
    

    【讨论】:

    • 谢谢。这样做很完美!
    【解决方案3】:

    这些年来,我曾多次被问到这个问题。您通常不能告诉鼠标事件侦听器告诉您鼠标经过的每个像素。如果您移动鼠标的速度足够快,甚至操作系统也可能会跳过屏幕的大部分区域。唯一可靠的方法是根据给定的鼠标位置历史自己绘制点。简单的方法是在当前点和最后一个点之间画一条线。更复杂的解决方案将涉及存储最后几个坐标并使用正弦/正切数学来绘制平滑曲线。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-01
      • 1970-01-01
      • 2011-10-06
      • 2011-06-20
      • 1970-01-01
      相关资源
      最近更新 更多