Вопрос

У меня есть весь необходимый код для перемещения и щелкнуть мышь через код C #, но я не хочу просто установить положение мыши в X а также Y; Это будет выглядеть jerky. Вместо этого я хочу иметь плавный переход от точки X1, Y1 В точку X2, Y2 более Z секунд. Похоже на ключевые фрахты.

Я ищу метод, похожий на это:

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));
        }
    }
Это было полезно?

Решение

Вы могли бы сделать это несколькими способами. Одним из вариантов будет рассчитывать вектор, необходимый для перемещения мыши каждый кадр и нанесите его в течение периода времени к положению мыши.

Итак, если мы находимся в положении 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);
    }
}

Еще один способ сделать это было бы использовать Алгоритм Брезенхэма Для расчета всех точек курсор мыши переместится, а затем продвигается через каждую точку и снова наносит его к курсору, используя резьбу.

Стив

Другие советы

Действительно зависит от вашего определения гладкого, однако, впрочем, большинство алгоритмов «гладкого» движения используют сплайн для интерполяции между 2 или более точками данных.

Это может помочьhttp://geekswithblogs.net/juandoneblo/archive/2007/10/25/data-interpolation-with-spline-in-csharp.aspx.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top