переменные автоответчика не обновляются при нажатии клавиш

#variables #automation #scope #autohotkey #hotkeys

Вопрос:

У меня есть несколько горячих клавиш, которые проходят различные процессы и спят в течение определенных периодов времени, чтобы можно было показывать анимацию. Я хочу настроить переменную, чтобы разрешить активацию только 1 в time…so если я нажму на первый, а затем на второй … второй ничего не сделает, пока не завершится первый. Точно так же я не хочу дважды активировать ни один из них, нажимая одну и ту же клавишу сразу после первого нажатия.

 F4:ExitApp
#IfWinActive ahk_class notepad

a::
if (work:=true){
work:=false
soundbeep
;do something
sleep 1000
work:=true
}
return

b::
if (work:=true){
work:=false
soundbeep
;do something else
sleep 2000
work:=true
}
return
 

т. е., если я нажму «a»…. » b «не сможет активироваться до тех пор, пока сон» a » не закончится. Также » а » не должен быть в состоянии активировать вторую time…at по крайней мере, до тех пор, пока его сон не закончится и работа=снова станет правдой.

Это оставляет 2 проблемы. Мне нужно сначала как-то указать начальное значение «work=true». Я не знаю, как это сделать в традиционном смысле. Просто поместить его в начало кода не работает. Вторая проблема, вставляя это в другой ключ…например, введите:: work:=true return…. и сначала нажмите эту клавишу…это не работает, так как это позволяет b подавать звуковой сигнал, в то время как a все еще находится в фазе сна. Так что, возможно, приведенный выше код тоже изначально ошибочен. Отдельные ключи, похоже, уважают себя и не инициализируются повторно, пока первый экземпляр не будет completed…so звуковые сигналы сработают, если я просто нажму 1 клавишу. Кроме того, я не хочу нажимать enter, чтобы код заработал после загрузки скрипта.

Есть ли здесь простой обман? Как и в lua, необъявленные переменные автоматически становятся ложными… поэтому я мог бы просто переключиться на if (work=false){…., хотя я не могу найти такого поведения с помощью autohotkey.

Ответ №1:

Как и было запрошено, вот другое решение, которое использует переменную логику для разрешения или предотвращения выполнения команд с горячими клавишами:

 #IfWinActive ahk_class Notepad
work:=true
a::
if(work){
    work:=false
    soundbeep
    ;do something
    sleep 1000
    work:=true
}
return

b::
if(work){
    work:=false
    soundbeep
    ;do something else
    sleep 2000
    work:=true
}
return
 

Обновление: Описание того, как это работает

Во-первых, сценарий начинается в разделе «Автоматическое выполнение«. Как изящно резюмировал мол-эсел

Когда запускается сценарий автоматической съемки, он просто начинает выполнение с первой строки вашего сценария. Оттуда он продолжается строка за строкой, пока не достигнет конечной точки. Это называется разделом автоматического выполнения.

Таким образом, включив work:=true в этот раздел скрипта, мы не только инициализируем значение переменной перед запуском любых горячих клавиш, но и устанавливаем область действия work глобальной переменной, доступной для разных горячих клавиш.

Остальная часть скрипта немного более проста, где каждая горячая клавиша по существу (в псевдокоде):

  • Когда срабатывает горячая клавиша
  • если work это правда
    • установлено work значение false
    • Звуковой сигнал и т. Д.
    • Подождите некоторое время
    • Затем установите work значение true, чтобы можно было выполнить другую команду
  • Завершите горячую клавишу

Комментарии:

1. Я привык к сценариям с точки зрения запуска только один раз или запуска в игровом цикле (30 раз в секунду). Как именно работает этот? Мне просто любопытно, в основном, с точки зрения работы:=истинная часть……это выполняется только один раз…? Я бы подумал, что это похоже на gameloop, и он продолжает обновлять себя как равный истине…перезаписывая любые другие задания, такие как false. Но эта строка работает так, как если бы это была начальная определенная переменная, которая запускается только один раз. Это так, и скрипт просто проверяет, если и горячие клавиши:: 100 раз или около того в секунду?

2. Это на мне — я должен был включить объяснение того, как работал код, когда писал ответ. Я обновил пост, включив в него этот @kite, так что проверьте его и lmk, если у вас есть какие-либо вопросы.

3. На самом деле этот код не всегда работает. Это работает для блокнота. но это не работает в приложениях, таких как игры. Мысли? Мне пришлось использовать метод maxthreads.

4. Чтобы заставить его работать для других вещей, просто снимите #IfWinActive ahk_class Notepad его сверху

5. я заметил, что это было удалено/обновлено соответствующим образом. все еще не работает. Остальная часть script….as У меня было, что он работает в игре, и да, все это в рамках этого #IFWINACTIVE part..so дело не в этом

Ответ №2:

Одним из простых способов сделать это было бы объявить #MaxThreads 1 в верхней части вашего сценария.

В качестве дополнительного примечания, в сценарии, по-видимому, есть несколько других синтаксических ошибок. Например, при сравнении значений (например, в if операторе) вы по-прежнему используете обычный, одиночный = , а не присваивание := . Кроме того, значение ahk_class чувствительно к регистру и поэтому #IfWinActive ahk_class notepad должно быть заменено на #IfWinActive ahk_class Notepad .


Обновленный код ( Work Переменная логика была удалена, так как она больше не нужна):

 #MaxThreads 1

#IfWinActive ahk_class Notepad

a::
soundbeep
;do something
sleep 1000
return

b::
soundbeep
;do something else
sleep 2000
return
 

Комментарии:

1. да, это, похоже, приводит к желаемому поведению. все еще хочу знать, как это сделать с переменными tho.

2. Конечно, я дам другой ответ, который решит эту проблему с помощью переменных элементов