1

Тема: 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

2

Re: AHK: Разные действия для одиночного и двойного нажатия клавиши

Пример обработки двойного клика мышью:

starttime := A_TickCount
doubleclick:=0

~Lbutton::
elapsedtime := A_TickCount - starttime
IF (elapsedtime < 250) and (doubleclick=1)
    {
    ; Сюда помещаем нужные действия.
    soundbeep, 1000, 50
    doubleclick:=0
    }
else
    {
    soundbeep, 1400, 50
    doubleclick := 1
    }
starttime := A_TickCount
return

f12::exitapp

Автор примера — ypppu.

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