Viktor1703
AutoIT Гуру
- Сообщения
- 1,535
- Репутация
- 413
Пример вызывает зарегистрированную функцию если же ввод с клавиатуры совпадает с зарегистрированной комбинаций, например может понадобится для доступа пользователю к настройкам вашей программы, так же можно реализовать смену секретного слова...
Попробуйте запустить скрипт и ввести на клавиатуре слово autoit. Конечно пример не идеален и есть свои баги, например если несколько раз ввести на клавиатуре слово Hello, то слово AutoIt не сработает, не могу понять из-за чего.
Код:
#include <WinAPI.au3>
Global $aHookRegister[2], $aCombinList[1][4]
Func CombinationRegister()
$aHookRegister[0] = DllCallbackRegister('__hock_Proc', 'long', 'int;wparam;lparam')
$aHookRegister[1] = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, DllCallbackGetPtr($aHookRegister[0]), _WinAPI_GetModuleHandle(''))
If $aHookRegister[1] Then
AdlibRegister('__compare_keys', 1)
Return 1
EndIf
Return 0
EndFunc
Func CombinationUnregister()
If $aHookRegister[1] Then
_WinAPI_UnhookWindowsHookEx($aHookRegister[1])
EndIf
If $aHookRegister[0] Then
DllCallbackFree($aHookRegister[0])
EndIf
AdlibUnRegister('__compare_keys')
EndFunc
Func AddCombinationEvent($aKeyList, $sProc)
If IsArray($aKeyList) And UBound($aKeyList) And Not Ubound($aKeyList, 2) Then
$aCombinList[0][0] += 1
ReDim $aCombinList[$aCombinList[0][0] + 1][UBound($aCombinList, 2)]
$aCombinList[$aCombinList[0][0]][0] = $aKeyList
$aCombinList[$aCombinList[0][0]][1] = $sProc
$aCombinList[$aCombinList[0][0]][2] = 0
For $i = 0 To UBound($aKeyList) -1
$aCombinList[$aCombinList[0][0]][3] += $aKeyList[$i]
Next
Return 1
EndIf
Return 0
EndFunc
Func __hock_Proc($nCode, $wParam, $lParam)
Local $ttKeyHook, $aTemp
$tKeyHook = DllStructCreate($tagKBDLLHOOKSTRUCT, $lParam)
If ($wParam = 256) Then
For $i = 1 To $aCombinList[0][0]
If DllStructGetData($tKeyHook, 'vkCode') == 0x10 And DllStructGetData($tKeyHook, 'vkCode') == 0x14 Then
ContinueLoop
EndIf
If __compare($aCombinList[$i][0], DllStructGetData($tKeyHook, 'vkCode')) Then
$aCombinList[$i][2] += DllStructGetData($tKeyHook, 'vkCode')
Else
$aCombinList[$i][2] = 0
EndIf
Next
EndIf
Return _WinAPI_CallNextHookEx(0, $nCode, $wParam, $lParam)
EndFunc
Func __compare_keys()
For $i = 1 To $aCombinList[0][0]
If $aCombinList[$i][2] == $aCombinList[$i][3] Then
Call($aCombinList[$i][1])
$aCombinList[$i][2] = 0
EndIf
Next
EndFunc
Func __compare($aKeys, $vkCode)
For $i = 0 To UBound($aKeys) -1
If ($aKeys[$i] = $vkCode) Then
Return 1
EndIf
Next
Return 0
EndFunc
; H E L L O
Global $aHello[5] = [0x48, 0x45, 0x4C, 0x4C, 0x4F] ; Virtual-Key Codes - http://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx
; A U T O I T
Global $aAutoIt[6] = [0x41, 0x55, 0x54, 0x4F, 0x49, 0x54]
If CombinationRegister() Then
$hForm = GUICreate('', 400, 300)
GUISetState()
AddCombinationEvent($aHello, '__hello')
AddCombinationEvent($aAutoIt, '__autoit')
While 1
Switch GUIGetMsg()
Case -3
CombinationUnregister()
Exit
EndSwitch
Wend
EndIf
Func __hello()
ConsoleWrite('Hello' & @CRLF)
EndFunc
Func __autoit()
MsgBox(0, '', 'I love AutoIt :)')
EndFunc
Попробуйте запустить скрипт и ввести на клавиатуре слово autoit. Конечно пример не идеален и есть свои баги, например если несколько раз ввести на клавиатуре слово Hello, то слово AutoIt не сработает, не могу понять из-за чего.