Autohotkey
February 20, 2023
AHK: разные действия в зависимости от числа нажатий на клавишу
🌰Назначаем несколько действий на одну клавишу, нажимаемую многократно
В справке AHK приводится пример определения количества нажатий на кнопку в течение определённого времени, но это не самый удобный метод.
Предлагаю использовать функцию MultiPress для этих целей. Она принимает в качестве параметров произвольное количество функций. Сколько раз клавиша была нажата, такая по счёту функция и запустится.
$Esc:: MultiPress( () => Send("{Esc}"), () => WinClose("A"), () => DllCall("LockWorkStation"))
- Однократное нажатие на Esc просто нажимает Esc. Чтобы скрипт не запускал себя по кругу, там стоит значок доллара.
- Двукратное нажатие закрывает активное окно.
- Троекратное (или многократное, или длительное) нажатие блокирует компьютер (как Win+L).
Вместо ()=>
можно писать Function.Bind(...)
:
$Esc:: MultiPress( Send.Bind("{Esc}"), WinClose.Bind("A"), DllCall.Bind("LockWorkStation"))
Далее код функции. Замените задержку (400 мс) на комфортную Вам:
#Requires AutoHotkey v2+ MultiPress(fun*) { static MULTIPRESS_DELAY := 400 ; время распознавания нажатий ; Принимает в параметрах произвольное число Func-объектов: ; SomeFunction или ()=>DoSomeAction или SomeFunction.Bind(Parameters) ; В зависимости от того, сколько раз вызвана в течение MULTIPRESS_DELAY, та функция и запускается static count := 0 Launcher() { ; Closure-замыкание ; Запускает функцию № count if count > fun.length { count := fun.length ; Слишком много нажатий } if fun.Has(count) { fun[count].Call() } count := 0 } if count > 0 { ; Таймер тикает, считаем нажатия count += 1 } else { ; count = 0, запускаем таймер count := 1 SetTimer Launcher, -MULTIPRESS_DELAY ; Минус, чтобы запустить таймер однократно } }
Можно скачать готовый скрипт.