我拥有所有必要的代码,移动和点击通过C#代码中的鼠标,但我不希望只是设置鼠标位置XY;那会显得生涩。相反,我想有从点到X1, Y1X2, Y2环Z秒的平稳过渡。类似于关键帧。

我正在寻找一个类似的方法:

public void TransitionMouse(int x, int y, double durationInSecs)

它只是将平滑地从它的当前位置移动鼠标来xydurationInSecs秒。我有一个被调用的函数:

public void MoveMouse(int x, int y)

这移动鼠标xy立即


修改

感谢您的帮助家伙!这里的完成,并且测试,代码:

    [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位置和要移动到20,30在10帧,我们的矢量将是以下内容:

VAL =(靶 - 开始)/帧;

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算法来计算所有的点鼠标光标将通过穿过每个点移动,然后循环和再次使用Thread.sleep代码,以保持正确的定时将其应用到光标。

史蒂夫

其他提示

确实取决于你的光滑,但是大多数算法的定义“平滑”运动使用花键到2个或更多的数据点之间进行内插。

这可以帮助 http://geekswithblogs.net /JuanDoNeblo/archive/2007/10/25/Data-Interpolation-with-SPLINE-in-Csharp.aspx

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top