【问题标题】:Looking for a way to smooth mouse movement in C#寻找一种在 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 轴上将鼠标移动了一定数量的像素,而不是硬设置屏幕上的位置。

我已经尝试将运动分成更小的部分,但由于像素不能加倍,这意味着有时,当除法有余数时,我会失去精度。

任何想法如何实施?我读过一些关于向量的东西,但我没有设法让它们按预期工作:(

干杯!

【问题讨论】:

    标签: c# events methods pixel mousemove


    【解决方案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)。所以没有错误的积累。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-22
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多