2017-02-17 17 views
0

У меня есть сценарий, в котором используется несколько mousemoves, и, при необходимости, я нажимаю F3, чтобы остановить перемещение, заставляющее перезагружать, или ESC, чтобы остановить перемещения, выходящие из приложения. Он работает отлично, без проблем на обычной скорости.Unstoppable script Issue

Проблема заключается в том, что когда я уменьшаю mousespeed и увеличиваю mousedelay, сценарий становится неостанавливаемым: несколько раз нажимаю клавиши F2, F3 и ESC (пытаясь остановить его), но сценарий игнорирует его и продолжает работать mousemoves.

Вот минимальный пример моей проблемы:

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 

Почему это происходит и как я могу это исправить (как я могу остановить сценарий даже при низкой скорости + большой задержкой)? ps: клавиша F1 запускает последовательность mousemoves.

ответ

2

MouseMove с ненулевой скоростью не может быть прерван другой горячей клавишей внутри одной и тот же AHK скрипт, потому что AutoHotkey является однопоточным внутри (это только emulates нитевидным поведение) и выполняет blocking sleep для каждого микродвижения мыши, пока он не достигнет общее расстояние, которое вы указали.

Решения:

  • Проверить, была ли нажата клавиша после каждый MouseMove, но это не мгновенное;
  • Внесите свой собственный MouseMove, который проверяет GetKeyState после каждого движения 1px;
  • Используйте мастер-скрипт, с помощью горячих клавиш, которые работают/пауза/стоп ребенка:

    Остановка: тривиальное, используйте Process Close
    Бег: ребенок должен скрывать иконку в трее в противном случае он будет оставаться после процесса тесного
    Приостановка : нетривиальные, но есть solutions (см. также базовые mechanics).

 Смежные вопросы

  • Нет связанных вопросов^_^