Autohotkey
February 20, 2023
Разные действия в зависимости от числа нажатий на клавишу в Autohotkey
🌰Назначаем несколько действий на одну клавишу, нажимаемую многократно
В справке 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 ; Минус, чтобы запустить таймер однократно
}
}