SharkyEXE icon

Untitled

SharkyEXE | PRO | 12/10/22 05:03:44 PM UTC | 0 ⭐ | 16217 👁️ | Never ⏰ | []
AutoIt |

6.14 KB

|

None

|

0 👍

/

0 👎

#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()

Comments

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎

    
        
  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎