寻找一种在 C# 中平滑鼠标移动的方法
Posted
技术标签:
【中文标题】寻找一种在 C# 中平滑鼠标移动的方法【英文标题】:Looking for a way to smooth mouse movement in C# 【发布时间】:2021-11-14 13:30:35 【问题描述】:所以,我已经准备好在 c# 中移动并单击 LMB 的每一行代码,但我的问题是游标只是传送到所需的位置,它看起来很糟糕。而不是“teleporation”发生,我希望鼠标在设定的时间(最好是毫秒)内平稳移动到所需位置。
我正在寻找类似这样的方法:
public void MoveMouse(int xDelta, int yDelta, double timeInMiliseconds)...
目前我用这个作为我的移动方法
[DllImport("user32.dll")]
static extern void mouse_event(int dwFlags, int dx, int dy, int dwData, int dwExtraInfo);
---
private const int MOUSEEVENTF_MOVE = 0x0001;
public static void MoveMouse(int x_Delta, int y_Delta)
mouse_event(MOUSEEVENTF_MOVE, xDelta, yDelta, 0, 0);
澄清一下,我在 X 和 Y 轴上将鼠标移动了一定数量的像素,而不是硬设置屏幕上的位置。
我已经尝试将运动分成更小的部分,但由于像素不能加倍,这意味着有时,当除法有余数时,我会失去精度。
任何想法如何实施?我读过一些关于向量的东西,但我没有设法让它们按预期工作:(
干杯!
【问题讨论】:
【参考方案1】:您可以每次迭代计算正确的位置,而不是使用增量:
int steps = 10;
for (i = 0; i <= steps; ++i)
int x = i * xDelta / steps;
int y = i * yDelta / steps;
mouse_event(MOUSEEVENTF_MOVE, x, y, 0, 0);
这应该保持精度。
【讨论】:
如果还是太快,把它放在一个async
方法里,把一个await Task.Delay(smallNumberOfMilliseconds);
放在循环里
问题是,当我将 33 作为 xDelta 值除以 10 步时,我得到 3,3,它被四舍五入为 3,所以我失去了 0,3 像素的运动。它发生在每一个动作中。这对我来说非常重要,因为这个错误会加起来。
@zjebinsky 不。在第一步你得到 3.3 四舍五入到 3
,第二步 - 6.6 四舍五入到 6
,第三步 - 9.9 四舍五入到 9
,但在第四 - 13.2 四舍五入到 13
(不是 12)。所以没有错误的积累。以上是关于寻找一种在 C# 中平滑鼠标移动的方法的主要内容,如果未能解决你的问题,请参考以下文章