1

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

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

    }
}
4

3 回答 3

3

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

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

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

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

于 2012-10-28T00:34:02.003 回答
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);
于 2012-10-28T01:00:04.540 回答
0

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

于 2012-10-28T00:53:24.400 回答