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 ; Минус, чтобы запустить таймер однократно
	}
}

Можно скачать готовый скрипт.