Advertisement
SharkyEXE

Untitled

Dec 10th, 2022
2,324
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
AutoIt 6.14 KB | None | 0 0
  1. #include <Misc.au3> ;библиотека нужна для отслеживания нажата ли клавиша
  2.  
  3. ; константы - настройки программы тайминги
  4. Global Const $TICK = 40          ; минимальный базовый интервал программы в миллисекундах
  5. Global Const $LONGINTERVAL = 10  ; количесвто интервалов $TICK для проверки длинного нажатия
  6. Global Const $DOUBLEINTERVAL = 3 ; количесвто интервалов $TICK для проверки паузы двойного нажатия
  7.  
  8. ; константы - настройки программы состояния
  9. Global Const $RELEASED = 0       ; состояние когда никакая кнопка не нажата
  10. Global Const $SINGLECLICKED = 1  ; состояние короткого нажатия
  11. Global Const $DOUBLECLICKED = 2  ; состояние двойного нажатия
  12. Global Const $LONGCLICKED = 3    ; состояние длинного нажатия
  13.  
  14. ; функция возвращает код нажатой клавиши в данный момент и 0 если клавиша не нажата
  15. Func _IsAnyKeyPressed()
  16.     For $i = 1 To 255 ;в цикле проверяем нажата ли клавиша
  17.         If _IsPressed(string((Hex($i, 2)))) Then
  18.             Return $i
  19.         EndIf
  20.     Next
  21.     Return 0
  22. EndFunc
  23.  
  24. ; Обработчик события одинарного / двойного / длинного нажатия
  25. ; цель - отреагировать на одинарное / двойное / длинное нажатие
  26. ; параметр: $key - нажатая кнопка
  27. ; параметр: $state - вид нажатия ($SINGLECLICKED, $DOUBLECLICKED, $LONGCLICKED)
  28. ; заметки: функцию можно менять
  29. ; заметки: для отображения ConsoleWrite запустить через AutiItEditor F5
  30. Func OnKeyEvent($key, $state)
  31.     Switch $state
  32.         Case $SINGLECLICKED
  33.             ConsoleWrite( @CRLF & 'Single click key code='  & string ($key) & @CRLF)
  34.         Case $DOUBLECLICKED
  35.             ConsoleWrite( @CRLF & 'Double click key code='  & string ($key) & @CRLF)
  36.         Case $LONGCLICKED
  37.             ConsoleWrite( @CRLF & 'Long press key code='  & string ($key) & @CRLF)
  38.     EndSwitch
  39. EndFunc
  40.  
  41. ; функция для прослушивания нажатий
  42. ; цель - получить одинарное / двойное / длинное нажатие
  43. ; заметки: функция в виде вечного цикла выход ESC
  44. Func ListenKey()
  45.     $current_key = 0
  46.     $current_state = 0
  47.     $stop_command = 0
  48.     $DOUBLECLICKED_count = 0
  49.     $LONGCLICKED_count = 0
  50.     While ($stop_command == 0)
  51.         Sleep($TICK)                                    ; пауза длиной $TICK миллисекунд
  52.         $new_key = _IsAnyKeyPressed()                   ; считываем новую клавишу
  53.         If ($new_key == 0 And $current_state == $LONGCLICKED) Then  ; если новая кнопка не нажата и до этого была долго нажата
  54.             OnKeyEvent($current_key, $LONGCLICKED)              ; вызываем событие длинного нажатия
  55.             $LONGCLICKED_count = 0
  56.             $DOUBLECLICKED_count = 0
  57.             $current_state = $RELEASED
  58.             $current_key = 0
  59.             ContinueLoop
  60.         ElseIf ($new_key == 0 And $current_key == 0) Then   ; если новая кнопка не нажата и до этого не была нажата и состояние не нажато то продолжаем
  61.             $DOUBLECLICKED_count = 0
  62.             $LONGCLICKED_count = 0
  63.             $current_state = $RELEASED
  64.             ContinueLoop
  65.         ElseIf ($new_key <> 0 And ($current_key == 0 Or $current_key == $new_key) And ($current_state == $RELEASED Or $current_state == $SINGLECLICKED)) Then
  66.             $current_state = $SINGLECLICKED                     ; если новая клавиша нажата, запускаем счетчик ожидания длинного нажатия
  67.             $LONGCLICKED_count = $LONGCLICKED_count + 1
  68.             If ($LONGCLICKED_count > $LONGINTERVAL) Then        ; если прошло время для интервала длинного нажатия то
  69.                 $current_state = $LONGCLICKED
  70.             EndIf
  71.         ElseIf ($new_key <> 0 And $current_key <> $new_key And $current_state == $SINGLECLICKED And $LONGCLICKED_count > 0) Then
  72.             $current_state = $SINGLECLICKED                     ; если новая клавиша нажата, до этого была нажата другая клавиша и был запущен счетчик длинного нажатия
  73.             OnKeyEvent($current_key, $SINGLECLICKED)                ; вызываем событие одинарного нажатия клавиши которая была нажата до новой
  74.             $LONGCLICKED_count = 1                              ; обнуляем счетчик
  75.         EndIf
  76.         If ($new_key <> 0 And $DOUBLECLICKED_count > 0 And $DOUBLECLICKED_count <= $DOUBLECLICKED) Then     ; если новая клавиша снова нажата, а до этого была не нажата,
  77.             $DOUBLECLICKED_count = 0                                                                            ; обнуляем счетчик
  78.             OnKeyEvent($new_key, $DOUBLECLICKED)                                                                ; вызываем событие двойного нажатия
  79.             $current_state = $DOUBLECLICKED
  80.             $current_key = 0
  81.         EndIf
  82.         If ($new_key == 0 And $current_state = $SINGLECLICKED And $DOUBLECLICKED_count <= $DOUBLECLICKED) Then      ; если новая клавиша не нажата, а до этого была нажата, запускаем счетчик ожидания двойного нажатия
  83.             $DOUBLECLICKED_count = $DOUBLECLICKED_count + 1
  84.             If($DOUBLECLICKED_count > $DOUBLECLICKED) Then
  85.                 $DOUBLECLICKED_count = 0
  86.                 $current_state = $RELEASED
  87.                 OnKeyEvent($current_key, $SINGLECLICKED)                ; вызываем событие одиночного нажатия
  88.                 $current_key = 0
  89.             EndIf
  90.         ElseIf ($current_state <> $LONGCLICKED) Then
  91.             $current_key = $new_key                     ;новая клавиша становится текущей
  92.         EndIf
  93.         If $current_key == 123 Then                         ;прерываем цикл при нажатии на ESC
  94.             $stop_command = 1
  95.         EndIf
  96.     WEnd
  97. EndFunc
  98.  
  99. ListenKey()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement