Question

J'ai tout le code nécessaire pour se déplacer et cliquez sur la souris via le code C #, mais je ne veux pas simplement régler la position de la souris pour X et Y; qui se penchera saccadée. Au lieu de cela, je veux avoir une transition en douceur du point X1, Y1 au point X2, Y2 secondes sur Z. Similaire à keyframing.

Je suis à la recherche d'une méthode similaire à ceci:

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

Il va juste déplacer la souris en douceur de sa position actuelle à x et y en secondes durationInSecs. J'ai une fonction appelée:

public void MoveMouse(int x, int y)

Cela déplace la souris à x, y immédiatement.


EDIT

Merci pour l'aide les gars! Voici le fini et testé, 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));
        }
    }
Était-ce utile?

La solution

Vous pouvez le faire de plusieurs façons. Une option serait de calculer le vecteur nécessaire pour déplacer la souris à chaque image et l'appliquer sur la période de temps à la position de la souris.

Alors, si nous sommes en position 5,5 et que vous souhaitez passer à 20,30 plus de 10 cadres, notre vecteur serait le suivant:

val = (cible - début) / trames;

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

Vecteur = 1.5,2.5

Ensuite, dans votre méthode de TransitionMouse, vous appliquez le vecteur à la position de la souris lentement sur quelque durée que ce que vous souhaitez, en utilisant la méthode Thread.Sleep pour contrôler la vitesse. Le code pourrait ressembler à ceci:

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

Une autre façon de le faire serait d'utiliser Bresenhams algorithme pour calculer tous les points le curseur de la souris se déplace à travers puis une boucle sur chaque point et l'appliquer à nouveau le curseur à l'aide Thread.Sleep pour maintenir le bon timing.

Steve

Autres conseils

vraiment dépend de votre définition de douceur, mais la plupart algorithme de mouvement utilisation spline « lisse » pour interpoler entre 2 ou plusieurs points de données.

cela pourrait aider http://geekswithblogs.net /JuanDoNeblo/archive/2007/10/25/Data-Interpolation-with-SPLINE-in-Csharp.aspx

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top