寻找一种在 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# 中平滑鼠标移动的方法的主要内容,如果未能解决你的问题,请参考以下文章

鼠标移动上去使字体变色,这代码怎么写

如何学习鼠标移动?

我正在寻找一种在拖动方向上旋转精灵的方法

如何使用 C# 移动鼠标光标?

如何用CSS 设置 当鼠标移动到菜单时,该按钮变色,鼠标点击后,页面停留在鼠标滑过时的状态!!很急!

js实现鼠标滑过显示二级菜单