Что нового

Как заставить скрипт вводить последний символ заданной комбинации клавиш?

yl3d

Новичок
Сообщения
70
Репутация
0
Добрый вечер, форумчане.
Обращаюсь с вопросом по скрипту AutoIt.

Скрипт при последовательном нажатии клавиш (одну за другой) "q","w","e" - и выводит окошко с сообщением "Сработал код".
Но при этом скрипт не дает ввестись последнему символу - и сразу запускает сообщение.
То есть если набирать в блокноте (при запущенном скрипте) - "qwe" - то введется только "qw" - а дальше запустится сообщение.

Как заставить данный скрипт - перед запуском сообщения - разрешать вводить последний символ - данной последовательной комбинации клавиш ?
(чтобы можно было ввести "qwe" - и лишь потом запускалось бы сообщение. )

Код:
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
 

Вложения

  • 124454.au3
    2.1 КБ · Просмотры: 0

Hiki

Новичок
Сообщения
27
Репутация
1
Последняя буква просто не успевает вводиться, потому что фокус от блокнота уходит к MsgBox.
Как временное решение могу посоветовать добавить Sleep, например так:
Код:
If $Index = Ubound($aAllCode) then
               Sleep(300)
               $Index = 0
               MsgBox(0,'','Сработал код '&$sBuffer)
               $sBuffer = ''
           EndIf

Но это не кошерно.
 
Автор
Y

yl3d

Новичок
Сообщения
70
Репутация
0
Hiki, теперь все сразу заработало. Большое спасибо за совет.
 
Верх