2017-02-17 2 views
0

Ich habe ein Skript, das mehrere Mausbewegungen verwendet, und wenn nötig, drücke ich F3, um die Bewegungen zu stoppen, die ein Neuladen erzwingen, oder ESC, um die Bewegungen zu stoppen, die die APP verlassen. Es funktioniert ohne Probleme in der normalen Geschwindigkeit.Unstoppable-Skript Ausgabe

Das Problem ist: Wenn ich die Mausgeschwindigkeit verringern und die Mausverzögerung erhöhen, wird das Skript unaufhaltbar: Ich drücke die F2, F3 und ESC Tasten mehrmals (versuchen, es zu stoppen), aber das Skript ignoriert es und läuft weiter Mausbewegungen.

Hier ist ein minimales Beispiel meines Problems:

SendMode Input 

$F1:: 
SetDefaultMouseSpeed, 50 
SetMouseDelay, 30 

Mousemove, 200, 200 
Mousemove, 600, 600 
Mousemove, 200, 200 
Mousemove, 600, 600 
Mousemove, 200, 200 
Mousemove, 600, 600 
Mousemove, 200, 200 
Mousemove, 600, 600 
Mousemove, 200, 200 
Mousemove, 600, 600 
Mousemove, 200, 200 
Mousemove, 600, 600 
Mousemove, 200, 200 
Mousemove, 600, 600 
Mousemove, 200, 200 
Mousemove, 600, 600 
Mousemove, 200, 200 
Mousemove, 600, 600 
Mousemove, 200, 200 
Mousemove, 600, 600 
Mousemove, 200, 200 
Mousemove, 600, 600 

SoundPlay, *48 
return 

$F2:: Pause 
$F3:: Reload 
$ESC:: ExitApp 

Warum ist es passiert und wie kann ich es beheben (wie kann ich das Skript auch bei geringer Geschwindigkeit + hohe Verzögerung Stopp)? ps: F1-Taste startet die mousemoves-Sequenz.

Antwort

2

Move mit Nicht-Null-Geschwindigkeit kann nicht durch einen anderen Hotkey im gleichen AHK-Skript unterbrochen werden, weil Autohotkey intern single-threaded ist (es nur emulates fadenartige Verhalten) und führt eine blocking sleep für jede Maus Mikrobewegung, bis er das erreicht Gesamtdistanz, die Sie angegeben haben. Lösungen

:

  • prüfen, ob ein Hotkey nach jeder Move, gedrückt wurde, aber es ist nicht sofortige;
  • Implementieren Sie Ihren eigenen MouseMove, der nach jeder 1px-Bewegung GetKeyState überprüft;
  • ein Master-Skript mit Hotkeys verwenden, das/Pause laufen/das Kind stoppen:

    Stopping: trivial, verwenden Process Close
    Laufen: das Kind Tray-Icon sonst verstecken sollte es nach dem Verfahren der Nähe
    Pausieren bleiben würde : nicht trivial, aber es gibt solutions (siehe auch die zugrunde liegende mechanics).