Нужно повторно отправить ключ, если он не обработан?

#loops #autohotkey

#циклы #автоотключение

Вопрос:

У меня запущен мой первый скрипт AHK, который перехватывает функциональные клавиши и преобразует их в мультимедийные ключи (только если включена блокировка прокрутки). Это отлично работает.

Однако, если блокировка прокрутки не включена, я хочу, чтобы AHK просто передал ключ в запущенное приложение. Итак, я добавил предложение else, чтобы просто повторно отправить ключ (см. Ниже), но это приводит к более чем 70 нажатиям клавиш в секунду, как только я нажимаю F3. Как будто я в цикле.

Что не так с этим кодом?

 F3::
  if GetKeyState("Scrolllock", "T") {
    Send {Volume_Up}
    SoundBeep 1000, 50
    SoundBeep 1100, 50
  } else {
    SendInput, {F3}
  }
return
 

Ответ №1:

 $F3::
  if GetKeyState("Scrolllock", "T") {
    Send {Volume_Up}
    SoundBeep 1000, 50
    SoundBeep 1100, 50
  } else {
    SendInput, {F3}
  }
return
 

Проблема, с которой вы столкнулись, заключалась в том, что ваша Send команда повторно запускала горячую клавишу, частью которой она была, что можно предотвратить с помощью модификатора $ .

Из документов:

Обычно это необходимо только в том случае, если скрипт использует команду отправки для отправки ключей, которые содержат саму горячую клавишу, что в противном случае может привести к ее запуску. Префикс $ заставляет использовать клавиатурный хук для реализации этой горячей клавиши, что в качестве побочного эффекта предотвращает запуск команды отправки. Префикс $ эквивалентен указанию #UseHook где-то над определением этой горячей клавиши.

Ответ №2:

Предполагая, что у вас нет более сложного скрипта, с которым могут возникнуть проблемы с оговорками #If , я бы рекомендовал следующий подход для любого переназначения, подобного этому.

 #If, GetKeyState("ScrollLock", "T")
F3::
    SendInput, {Volume_Up}
    SoundBeep, 1000, 50
    SoundBeep, 1100, 50
return
#If
 

Таким образом, F3 сохраняет свою первоначальную функциональность, когда блокировка прокрутки не включена.

(Отправка F3 не совпадает с фактически используемой клавишей, некоторые программы могут не распознать имитированное нажатие клавиши, особенно если он использует прямой ввод, и вы также теряете функциональность удерживания F3)