Что нового

Определение последовательного нажатия клавиш

yl3d

Новичок
Сообщения
70
Репутация
0
Версия AutoIt: : v3.3.14.0

Описание:

Приветствую всех жителей форума.
Обращаюсь с вопросом по скрипту AutoIt.

Как заставить скрипт автоит - реагировать на последовательность нажатия клавиш ?
Я последовательно, одну за другой, нажимаю три клавиши на клавиатуре "q","w","e" - и выводится окошко с сообщением "скрипт запущен".
Затем скрипт прекращает работу.

Примечания:
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
yl3d [?]
Я последовательно, одну за другой, нажимаю три клавиши на клавиатуре "q","w","e" - и выводится окошко с сообщением "скрипт запущен".
Код:
#include <Misc.au3>
$i = 0

While 1

   Select
	  Case $i < 1 And _IsPressed("51")
		 $i += 1
	  Case $i < 2 And _IsPressed("57")
		 $i += 1
	  Case $i < 3 And _IsPressed("45")
		 $i += 1
	  Case _IsPressed("1B")
		 ExitLoop
	  Case $i = 3
		 MsgBox(64, "", "скрипт запущен")
		 $i = 0
   EndSelect

   Sleep(10)
WEnd
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Если будет нажата, например "е" , то "MsgBox" появится сразу без кнопок "q" и "w", что-бы работал Ваш пример нужно немного изменить :
Код:
#include <Misc.au3>
$i = 0

While 1

   Select
      Case $i = 0 And _IsPressed("51")
         $i += 1
      Case $i = 1 And _IsPressed("57")
         $i += 1
      Case $i = 2 And _IsPressed("45")
         $i += 1
      Case _IsPressed("1B")
         ExitLoop
      Case $i = 3
         MsgBox(64, "", "скрипт запущен")
         $i = 0
   EndSelect
WEnd
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Автор
Y

yl3d

Новичок
Сообщения
70
Репутация
0
ra4o , немного не так.
Я имел ввиду последовательное нажатие.

Если нажать q, a,w, s, d, e - то скрипт сработает все равно, поскольку считывает даже непоследовательное нажатие q, w, e.
Или если нажать q, e, w, q, e - скрипт также сработает, поскольку считывает нажатие целевых клавиш - даже вразнобой.
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
На просторах интернета нашел код CreatoR-а по перехвату клавиатурных нажатий, немного его переделал под Ваши нужды, вот. что получилось :
Код:
HotKeySet("{ESC}", "OnAutoItExit")

Global Const $WH_KEYBOARD_LL    = 13

Global $aAllCode=['Q','W','E'] ; наш код
Global $Index=0

Global $sBuffer                 = ""
Global $hStub_KeyProc           = DllCallbackRegister("_KeyProc", "int", "int;ptr;ptr")
Global $hMod                    = DllCall("kernel32.dll", "hwnd", "GetModuleHandle", "ptr", 0)
Global $hHook                   = DllCall("user32.dll", "hwnd", "SetWindowsHookEx", "int", _
    $WH_KEYBOARD_LL, "ptr", DllCallbackGetPtr($hStub_KeyProc), "hwnd", $hMod[0], "dword", 0)

While 1
    Sleep(10)
WEnd

Func EvaluateKey($nKeyCode)
    If (($nKeyCode > 22) And ($nKeyCode < 91)) _
        Or (($nKeyCode > 47) And ($nKeyCode < 58)) Then
		$Code = Chr($nKeyCode)
		If $Code = $aAllCode[$Index] Then
           $sBuffer &= Chr($nKeyCode)
		   $Index+=1
		   
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Код сработал !
		   If $Index = Ubound($aAllCode) then
			   $Index = 0
			   MsgBox(0,'','Сработал код '&$sBuffer)
			   $sBuffer = ''
		   EndIf
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

		Else
		   $Index=0
		   $sBuffer=''
		EndIf

    ElseIf ($nKeyCode > 159) And ($nKeyCode < 164) Then
        Return
    EndIf
EndFunc

Func _KeyProc($nCode, $wParam, $lParam)
    Local $aRet, $KEYHOOKSTRUCT

    If $nCode < 0 Then
        $aRet = DllCall("user32.dll", "long", "CallNextHookEx", "hwnd", $hHook[0], "int", $nCode, "ptr", $wParam, "ptr", $lParam)
        Return $aRet[0]
    EndIf

    If $wParam = 256 Then
        $KEYHOOKSTRUCT = DllStructCreate("dword;dword;dword;dword;ptr", $lParam)
        EvaluateKey(DllStructGetData($KEYHOOKSTRUCT, 1))
    EndIf

    $aRet = DllCall("user32.dll", "long", "CallNextHookEx", "hwnd", $hHook[0], "int", $nCode, "ptr", $wParam, "ptr", $lParam)

    Return $aRet[0]
EndFunc

Func OnAutoItExit()
    If $hStub_KeyProc Then DllCallbackFree($hStub_KeyProc)
    $hStub_KeyProc = 0
    DllCall("user32.dll", "int", "UnhookWindowsHookEx", "hwnd", $hHook[0])
    If @HotKeyPressed <> "" Then Exit
EndFunc
 
Автор
Y

yl3d

Новичок
Сообщения
70
Репутация
0
ra4o, теперь все работает.
огромное спасибо.
 
Верх