2013-08-06 5 views
0

Je voudrais savoir s'il est possible de déplacer le curseur sans verrouiller le thread UI dans Winforms. En d'autres termes; une solution asynchrone.Déplacement du curseur de la souris asynchrone

Ma solution synchrone actuelle:

private void Form1_Load(object sender, EventArgs e) 
{ 
    TimeSpan delayt = new TimeSpan(0, 0, 3); 
    LinearSmoothMove(new Point(20, 40), delayt); 
} 

[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; 

    double deltaX = newPosition.X - start.X; 
    double deltaY = newPosition.Y - start.Y; 

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

En utilisant 'Timer'? (Au moins c'est le plus simple) –

+0

@KingKing Oui, j'espérais une autre alternative – Johan

+0

Au moins c'est mieux que la solution actuelle de la vôtre. –

Répondre

2

vous pouvez utiliser le BackgroundWorker comme dit romano, mais pour cette petite fonction, vous pouvez il suffit d'utiliser une minuterie:

private void Form1_Load(object sender, EventArgs e) 
{ 
    System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer(); 
    timer.Interval = 10; 
    timer.Tick += new EventHandler(t_Tick); 
    timer.Start(); 
} 

    void OnTick(object sender, EventArgs e) 
    { 
    // Your code 
    } 
1

Vous pouvez utiliser un fil ou un BackgroundWorker comme ceci:

 BackgroundWorker bw = new BackgroundWorker(); 

     bw.DoWork += (s, ex) => 
      { 
       SetCursorPos(0, 0); 
      }; 

     bw.RunWorkerAsync(); 
+0

Pour autant que je sache, 'BackgroundWorker' ne fait pas le travail périodiquement, pour que cela fonctionne de cette façon, vous devez appeler' Thread.Sleep (...) '? Ce n'est pas adapté au problème de l'OP. –

+0

Vous avez raison. J'ai mal son problème. Je pensais qu'il a vraiment besoin de faire cela en dehors du fil de l'interface utilisateur. –

Questions connexes