Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <Misc.au3> ;библиотека нужна для отслеживания нажата ли клавиша
- ; константы - настройки программы тайминги
- 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()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement