Тема: AHK: Разные действия для одиночного и двойного нажатия клавиши
Под двойным нажатием подразумевается быстрое нажатие клавиши 2 раза, наподобие двойного щелчка мыши. С помощью этого приёма можно, например, расширить возможности функциональных клавиш.
В общем, никакой Америки я тут не открываю, способ давно известен, просто выделил общую часть кода, чтобы не прописывать одно и то же для каждой клавиши.
В том виде, как здесь, скрипт требует по крайней мере версию 1.0.46.16, т.к. использует добавленную там возможность - одноразовый таймер. Теперь, если время таймера задать со знаком минус, он сработает только один раз, что очень удобно в некоторых случаях.
Почему я применил таймеры, а не просто переходы к меткам: потому что таймер запускает свою подпрограмму как отдельный поток, таким образом процедура счётчика не должна ждать её окончания и сразу же освобождается для обработки нажатий других клавиш.
Само собой, круглые скобки в F11(1): - это не вызов функции, а просто часть имени метки.
#UseHook, On ; Предосторожность на случай, если клавиша должна будет
; посылать саму себя. Делает то же, что префикс $, только
; для всех гор. клавиш, которые ниже.
;----- Пример для клавиши F11 -----------
F11:: Gosub, PressCount ; Запускается счётчик нажатий.
F11(1): ; Код для одиночного нажатия F11.
Msgbox, F11 нажата 1 раз.
Return
F11(2): ; Код для двойного нажатия F11.
Msgbox, F11 нажата 2 раза.
Return
;----- Пример для правой кнопки мыши ----
RButton:: Gosub, PressCount
RButton(1): ; Одиночный действует как и раньше (почти,
Click Down Right ; т.к. пауза иногда даёт о себе знать при
KeyWait, RButton ; перетаскивании правой кнопкой).
Click Up Right
Return
RButton(2):
ToolTip, Двойной правый щелчок.
Sleep, 1000
ToolTip
Return
;-----------------------------------------
#UseHook, Off
;----- Общая часть кода (счётчик нажатий) ------
PressCount:
Pause_=300 ; Если пауза меньше этого количества миллисекунд, то нажатие
; двойное. Если больше, то оно расценивается как 2 одиночных.
If not Second
{
Second=1
SetTimer, DoublePress, -%Pause_%
}
Else
{
Second=0
SetTimer, %A_ThisHotkey%(2), -1
}
Return
DoublePress:
If not Second
Return
Second=0
SetTimer, %A_ThisHotkey%(1), -1
Return