2011-05-05 2 views
3

J'essaie de déplacer la souris par programme entre deux coordonnées. Mais je veux maintenir la vitesse de manière fiable sur toutes les machines de traitement rapides ou lents. J'ai vu this link here. Mais il ne me garantit pas la vitesse optimale, lisse et visible du curseur lors de la simulation du mouvement entre deux coordonnées. Je me demande si quelqu'un connaît une astuce pour déterminer les paramètres comme le délai et les étapes de valeur optimale pour diverses machines Comme ma première idée était l'utilisation de boucle pour iteraton spécifique pour déterminer la performance de la machine puis évaluer les paramètres en fonction du temps -loop a pris ... une idée? ou suis-je totalement faux à ce sujet? Mercisimule déplacer le curseur de la souris dans C# entre deux coordonnées

Répondre

3

Vous devez faire du mouvement une fonction du temps. A partir de la réponse à C# moving the mouse around realistically, et en utilisant la classe Chronomètre pour mesurer le temps écoulé:

public void LinearSmoothMove(Point newPosition, TimeSpan duration) 
{ 
    Point start = GetCursorPosition(); 

    // Find the vector between start and newPosition 
    double deltaX = newPosition.X - start.X; 
    double deltaY = newPosition.Y - start.Y; 

    // start a timer 
    Stopwatch stopwatch = new Stopwatch(); 
    stopwatch.Start(); 

    double timeFraction = 0.0; 

    do 
    { 
     timeFraction = (double)stopwatch.Elapsed.Ticks/duration.Ticks; 
     if (timeFraction > 1.0) 
      timeFraction = 1.0; 

     PointF curPoint = new PointF(start.X + timeFraction * deltaX, 
            start.Y + timeFraction * deltaY); 
     SetCursorPosition(Point.Round(curPoint)); 
     Thread.Sleep(20); 
    } while (timeFraction < 1.0); 
} 
+0

cela semble bon, mais je ne pouvais pas saisir encore plus lent avec cet algorithme. Cela devient simplement instantané. J'ai utilisé différents Timespan et des valeurs de retard pour le mesurer. – Deku

+0

@Deku - Je vous ai vu accepter la réponse une heure ou deux après votre commentaire. Avez-vous compris ce qui n'allait pas? Je n'ai pas testé ce code. Avait-il besoin de changements? – Justin

+0

.. Je lui ai donné une réponse parce que c'est une meilleure solution. Mais n'a pas exactement répondu à ma question pour la question ci-dessus. Voici le code pour le tester. – Deku

0

Je recommande une physique. La vitesse est la distance divisée par le temps. Si vous voulez une vitesse constante de la souris sur chaque machine, vous devez avoir une heure précise.

Faisons un exemple:

Vous voulez déplacer la souris du point à 400/600 et 0/0 le point final doit toujours être atteint au bout de 3 secondes. Par conséquent, vous devez enregistrer l'heure de début et construire une boucle while qui se terminera au début + 3s. Dans la boucle, vous calculez les coordonnées X et Y à partir du temps écoulé et du temps total.

X = 400/3s * ElapsedTime 
Y = 600/3s * ElapsedTime 

Ceci sera indépendant de la machine. Pour un bon résultat, vous devriez utiliser un temps très précis comme Stopwatch.

0

J'ai essayé celui-ci mais toujours pas optimal. Il varie encore avec la puissance de traitement de la machine. @ Justin, utilise une valeur différente pour la durée et le temps de sommeil. Faites-moi savoir si vous venez avec une meilleure solution après l'avoir testé. Merci!

using System; 
using System.Drawing; 
using System.Runtime.InteropServices; 
using System.Windows.Forms; 
using System.Diagnostics; 
using System.Threading; 

namespace ConsoleApplication11 
{ 
    class Program 
    { 

     [DllImport("user32.dll")] 
     static extern bool SetCursorPos(int X, int Y); 

     public static void LinearSmoothMove(Point newPosition, TimeSpan duration) 
     { 
      Point start = Cursor.Position; 
      int sleep = 10; 
      //PointF iterPoint = start; 
      // Find the vector between start and newPosition 
      double deltaX = newPosition.X - start.X; 
      double deltaY = newPosition.Y - start.Y; 
      // start a timer  
      Stopwatch stopwatch = new Stopwatch(); 
      stopwatch.Start(); 
      double timeFraction = 0.0; 
      do 
      { 
       timeFraction = (double)stopwatch.Elapsed.Ticks/duration.Ticks; 
       if (timeFraction > 1.0) 
       timeFraction = 1.0; 
       PointF curPoint = new PointF((float)(start.X + timeFraction * deltaX), (float)(start.Y + timeFraction * deltaY)); 
       SetCursorPos(Point.Round(curPoint).X, Point.Round(curPoint).Y); 
       Thread.Sleep(sleep); 
      } while (timeFraction < 1.0); 
     } 
     static void Main(string[] args) 
     { 
      TimeSpan delayt = new TimeSpan(0, 0, 3); 
      LinearSmoothMove(new Point(20, 40), delayt); 
      Console.Read(); 
     }  
    } 
} 
Questions connexes