我拥有通过 C# 代码移动和单击鼠标所需的所有代码,但我不想只将鼠标位置设置为 X
和 Y
;那会看起来生涩。相反,我希望在 Z 秒内从点 X1, Y1
平滑过渡到点 X2, Y2
。类似于关键帧。
我正在寻找与此类似的方法:
public void TransitionMouse(int x, int y, double durationInSecs)
它会在 durationInSecs
秒内将鼠标从当前位置平滑移动到 x
和 y
。我有一个函数叫做:
public void MoveMouse(int x, int y)
立即将鼠标移动到x
、y
。
编辑
感谢大佬们的帮助!这是完成并经过测试的代码:
[DllImport("user32.dll")]
static extern bool SetCursorPos(int X, int Y);
public void TransitionMouseTo(double x, double y, double durationSecs)
{
double frames = durationSecs*100;
PointF vector = new PointF();
PointF mousePos = Cursor.Position;
vector.X = (float)((x - mousePos.X) / frames);
vector.Y = (float)((y - mousePos.Y) / frames);
for (int i = 0; i < frames; i++)
{
SetCursorPos((int)(mousePos.X += vector.X), (int)(mousePos.Y += vector.Y));
Thread.Sleep((int)((durationSecs / frames) * 1000.0));
}
}
最佳答案
您可以通过多种方式做到这一点。一种选择是计算每帧移动鼠标所需的矢量,并在一段时间内将其应用于鼠标位置。
因此,如果我们在位置 5,5 并希望在 10 帧内移动到 20,30,我们的向量将如下所示:
val = (target - start)/frames;
x = (20 - 5)/10; y = (30 - 5)/10;
矢量 = 1.5,2.5
然后,在您的 TransitionMouse 方法中,您可以在您希望的任何持续时间内将矢量缓慢地应用于鼠标位置,使用 Thread.Sleep 方法来控制速度。代码可能如下所示:
public void TransitionMouseTo(int x, int y, int durationSecs)
{
int frames = 10;
PointF vector = new PointF();
vector.X = (x - Cursor.Position.X) / frames;
vector.Y = (y - Cursor.Position.Y) / frames;
for (int i = 0; i < frames; i++)
{
Point pos = Cursor.Position;
pos.X += vector.X;
pos.Y += vector.Y;
Cursor.Position = pos;
Thread.Sleep((durationSecs / frames) * 1000);
}
}
另一种方法是使用 Bresenhams algorithm计算鼠标光标将移动经过的所有点,然后遍历每个点并使用 Thread.Sleep 再次将其应用于光标以保持时间正确。
史蒂夫
关于C#平滑对象移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4015488/