Frage

Ich habe alle notwendigen Codes mit der Maus über C # -Code zu bewegen und klicken Sie auf, aber ich will nicht auf nur die Mausposition zu X und Y; das wird aussehen ruckelt. Stattdessen möchte ich von Punkt X1, Y1 Punkt X2, Y2 über Z Sekunden, um einen reibungslosen Übergang haben. Ähnlich wie Keyframing.

Ich suche nach einem ähnlichen Verfahren wie folgt aus:

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

Es bewegt sich nur sanft mit der Maus von der aktuellen Position zu x und y in durationInSecs Sekunden. Ich habe eine Funktion namens:

public void MoveMouse(int x, int y)

Dass die Maus bewegt x, y sofort.


Bearbeiten

Vielen Dank für die Hilfe Jungs! Hier ist die fertig und getestet, Code:

    [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));
        }
    }
War es hilfreich?

Lösung

Sie können dies tun, in mehrfacher Hinsicht. Eine Möglichkeit wäre, den Vektor zu berechnen, die erforderlich die Maus für jeden Rahmen zu bewegen, und wenden Sie es über den Zeitraum der aktuellen Mausposition.

Wenn wir also an Position sind 5,5 und wollen 20,30 über 10 Frames bewegen, unser Vektor wäre die folgende:

val = (Ziel - Start) / Rahmen;

x = (20-5) / 10; y = (30-5) / 10;

Vector = 1.5,2.5

Dann in Ihrem TransitionMouse Methode wenden Sie den Vektor der Mausposition langsam über alles, was Dauer Sie wünschen, die Thread.Sleep Methode mit der Geschwindigkeit zu steuern. Der Code könnte wie folgt aussehen:

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);
    }
}

Eine andere Möglichkeit, es zu tun wäre, Bresenhams Algorithmus alle Punkte berechnen das Maus-Cursor bewegen, durch und dann eine Schleife durch jeden Punkt und wendet es wieder auf die Cursor unter Verwendung das Timing Thread.Sleep korrekt zu halten.

Steve

Andere Tipps

wirklich abhängig von Ihrer Definition von glatten, aber die meisten Algorithmus von „glatter“ Bewegung Verwendung Spline Interpolations zwischen zwei oder mehr Datenpunkten.

Dies könnte helfen http://geekswithblogs.net /JuanDoNeblo/archive/2007/10/25/Data-Interpolation-with-SPLINE-in-Csharp.aspx

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top