Domanda

Sto cercando di spostare il mouse programmaticamente tra due coordinate. Ma voglio mantenere la velocità in modo affidabile su tutte le macchine di elaborazione veloci o lente. vidi Questo link qui. Ma non mi vacilla la velocità ottimale, liscia e visibile del cursore durante la simulazione della mossa tra due coordinate. Mi chiedo se qualcuno conosca un trucco per determinare i parametri come ritardo e passaggi un valore ottimale per varie macchine come la mia prima idea è stato usare per loop per iteraton specifico per determinare la performance della macchina, quindi classificare i parametri in base a quanto tempo il per -loop ha preso ... un'idea? O mi sbaglio totalmente su questo? Grazie

È stato utile?

Soluzione

Dovresti rendere il movimento una funzione del tempo. A partire dalla risposta a C# muovendo realisticamente il mouse, e usando la classe StopWatch per misurare il tempo trascorso:

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

Altri suggerimenti

Consiglierei un po 'di fisica. La velocità è la distanza divisa per tempo. Se vuoi una velocità del mouse del consantino su ogni macchina devi avere un tempo accurato.

Facciamo un esempio:

Si desidera spostare il mouse dal punto 0/0 a 400/600 e l'endpoint dovrebbe essere sempre raggiunto dopo 3 secondi.

Pertanto è necessario salvare l'ora di inizio e costruire un po 'che loop che finirà a StartTime + 3s. Nel ciclo si calcola le coordinate X e Y dal tempo trascorso e totale.

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

Questo sarà indipendentemente. Per un buon risultato dovresti usare un tempo accurato come Cronometro.

Ho provato questo ma ancora non ottimale. Varia ancora con la potenza di elaborazione della macchina.@Justin, usa un valore diverso per la durata e il tempo di sonno. Fammi sapere se ti viene in mente una soluzione migliore dopo averlo testato. Grazie!

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();
        }       
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top