#include ;библиотека нужна для отслеживания нажата ли клавиша ; константы - настройки программы тайминги Global Const $TICK = 40 ; минимальный базовый интервал программы в миллисекундах Global Const $LONGINTERVAL = 10 ; количесвто интервалов $TICK для проверки длинного нажатия Global Const $DOUBLEINTERVAL = 3 ; количесвто интервалов $TICK для проверки паузы двойного нажатия ; константы - настройки программы состояния Global Const $RELEASED = 0 ; состояние когда никакая кнопка не нажата Global Const $SINGLECLICKED = 1 ; состояние короткого нажатия Global Const $DOUBLECLICKED = 2 ; состояние двойного нажатия Global Const $LONGCLICKED = 3 ; состояние длинного нажатия ; функция возвращает код нажатой клавиши в данный момент и 0 если клавиша не нажата Func _IsAnyKeyPressed() For $i = 1 To 255 ;в цикле проверяем нажата ли клавиша If _IsPressed(string((Hex($i, 2)))) Then Return $i EndIf Next Return 0 EndFunc ; Обработчик события одинарного / двойного / длинного нажатия ; цель - отреагировать на одинарное / двойное / длинное нажатие ; параметр: $key - нажатая кнопка ; параметр: $state - вид нажатия ($SINGLECLICKED, $DOUBLECLICKED, $LONGCLICKED) ; заметки: функцию можно менять ; заметки: для отображения ConsoleWrite запустить через AutiItEditor F5 Func OnKeyEvent($key, $state) Switch $state Case $SINGLECLICKED ConsoleWrite( @CRLF & 'Single click key code=' & string ($key) & @CRLF) Case $DOUBLECLICKED ConsoleWrite( @CRLF & 'Double click key code=' & string ($key) & @CRLF) Case $LONGCLICKED ConsoleWrite( @CRLF & 'Long press key code=' & string ($key) & @CRLF) EndSwitch EndFunc ; функция для прослушивания нажатий ; цель - получить одинарное / двойное / длинное нажатие ; заметки: функция в виде вечного цикла выход ESC Func ListenKey() $current_key = 0 $current_state = 0 $stop_command = 0 $DOUBLECLICKED_count = 0 $LONGCLICKED_count = 0 While ($stop_command == 0) Sleep($TICK) ; пауза длиной $TICK миллисекунд $new_key = _IsAnyKeyPressed() ; считываем новую клавишу If ($new_key == 0 And $current_state == $LONGCLICKED) Then ; если новая кнопка не нажата и до этого была долго нажата OnKeyEvent($current_key, $LONGCLICKED) ; вызываем событие длинного нажатия $LONGCLICKED_count = 0 $DOUBLECLICKED_count = 0 $current_state = $RELEASED $current_key = 0 ContinueLoop ElseIf ($new_key == 0 And $current_key == 0) Then ; если новая кнопка не нажата и до этого не была нажата и состояние не нажато то продолжаем $DOUBLECLICKED_count = 0 $LONGCLICKED_count = 0 $current_state = $RELEASED ContinueLoop ElseIf ($new_key <> 0 And ($current_key == 0 Or $current_key == $new_key) And ($current_state == $RELEASED Or $current_state == $SINGLECLICKED)) Then $current_state = $SINGLECLICKED ; если новая клавиша нажата, запускаем счетчик ожидания длинного нажатия $LONGCLICKED_count = $LONGCLICKED_count + 1 If ($LONGCLICKED_count > $LONGINTERVAL) Then ; если прошло время для интервала длинного нажатия то $current_state = $LONGCLICKED EndIf ElseIf ($new_key <> 0 And $current_key <> $new_key And $current_state == $SINGLECLICKED And $LONGCLICKED_count > 0) Then $current_state = $SINGLECLICKED ; если новая клавиша нажата, до этого была нажата другая клавиша и был запущен счетчик длинного нажатия OnKeyEvent($current_key, $SINGLECLICKED) ; вызываем событие одинарного нажатия клавиши которая была нажата до новой $LONGCLICKED_count = 1 ; обнуляем счетчик EndIf If ($new_key <> 0 And $DOUBLECLICKED_count > 0 And $DOUBLECLICKED_count <= $DOUBLECLICKED) Then ; если новая клавиша снова нажата, а до этого была не нажата, $DOUBLECLICKED_count = 0 ; обнуляем счетчик OnKeyEvent($new_key, $DOUBLECLICKED) ; вызываем событие двойного нажатия $current_state = $DOUBLECLICKED $current_key = 0 EndIf If ($new_key == 0 And $current_state = $SINGLECLICKED And $DOUBLECLICKED_count <= $DOUBLECLICKED) Then ; если новая клавиша не нажата, а до этого была нажата, запускаем счетчик ожидания двойного нажатия $DOUBLECLICKED_count = $DOUBLECLICKED_count + 1 If($DOUBLECLICKED_count > $DOUBLECLICKED) Then $DOUBLECLICKED_count = 0 $current_state = $RELEASED OnKeyEvent($current_key, $SINGLECLICKED) ; вызываем событие одиночного нажатия $current_key = 0 EndIf ElseIf ($current_state <> $LONGCLICKED) Then $current_key = $new_key ;новая клавиша становится текущей EndIf If $current_key == 123 Then ;прерываем цикл при нажатии на ESC $stop_command = 1 EndIf WEnd EndFunc ListenKey()