我有所有必要的代码移动并通过C#代码单击鼠标,但我不想只将鼠标位置设置为X
和Y
;那看起来很生涩。相反,我希望在Z秒内从点X1, Y1
平滑过渡到点X2, Y2
。与keyframing类似。
我正在寻找类似的方法:
public void TransitionMouse(int x, int y, double durationInSecs)
它会在x
秒内将鼠标从当前位置平滑移动到y
和durationInSecs
。我有一个叫做的函数:
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));
}
}
答案 0 :(得分:7)
你可以用几种方式做到这一点。一种选择是计算每帧移动鼠标所需的向量,并将其在整个时间段内应用到鼠标位置。
所以,如果我们处于第5,5位并希望在10帧以上移动到20,30,我们的向量将如下:
val =(目标 - 开始)/帧;
x =(20 - 5)/ 10; y =(30 - 5)/ 10;
Vector = 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再次将其应用于光标以保持时间正确
史蒂夫
答案 1 :(得分:0)
实际上取决于您对平滑的定义,但大多数“平滑”运动算法使用样条曲线在2个或更多数据点之间进行插值。
这可能会有所帮助 http://geekswithblogs.net/JuanDoNeblo/archive/2007/10/25/Data-Interpolation-with-SPLINE-in-Csharp.aspx