Keyboard Hook einsetzen und verstehen

07/15/2011 08:15 FizzeBu#1
Hoi,

ich will für Terraria ein kleines Script schreiben, welches die Tastatureingaben modifiziert an das aktive Fenster weitergibt. Mal gegoogelt und auf Keyboard Hooks gestoßen.
Naja, ich komm mit einem Code, den ich gerne verstehen würde um auch die Keybord Hooks zu verstehen, nicht zurecht.

Code:
#include <WinAPI.au3>
#include <WindowsConstants.au3>
HotKeySet('{F3}', '_EXIT')

Dim $hHook, $hFunc
Dim $pFunc

$hFunc = DllCallbackRegister('_KeyboardHook', 'long', 'int;wparam;lparam')
$pFunc = DllCallbackGetPtr($hFunc)

$hHook = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, $pFunc, _WinAPI_GetModuleHandle(0))

While 1
    Sleep(15)
WEnd


Func _EXIT()
    Exit
EndFunc

Func OnAutoItExit()
    _WinAPI_UnhookWindowsHookEx($hHook)
    DllCallbackFree($hFunc)
EndFunc

Func _KeyboardHook($iCode, $iwParam, $ilParam)
    Local $tKHS = DllStructCreate($tagKBDLLHOOKSTRUCT, $ilParam)
    Local $vkCode, $iScanCode
    
    If $iCode > -1 Then
        $vkCode = DllStructGetData($tKHS, 'vkCode')
        If $iwParam = $WM_SYSKEYUP Then
            Switch $vkCode
                Case 0x30 To 0x39
                    ConsoleWrite($vkCode & @LF)
                    _keybd_event(0x12, 2)  ; 2 = KEYEVENTF_KEYUP
                    _keybd_event($vkCode+0x30, 0)
                    Return 1
            EndSwitch
        EndIf
    EndIf
    
    Return _WinAPI_CallNextHookEx($hHook, $iCode, $iwParam, $ilParam)
EndFunc


Func _keybd_event($bvkCode, $Flag)
    DllCall('user32.dll', 'int', 'keybd_event', 'byte', $bvkCode, 'byte', 0, 'uint', $Flag, 'ptr', 0)
EndFunc; _keybd_event
Ist von hier: [Only registered and activated users can see links. Click Here To Register...]

Wenn sich jemand damit auskennst, könnte sich jemand die Mühe machen hinter jede Zeile eine Erklärung zu schreiben? Also einiges versteh ich ja, aber die Funktionen _KeyboardHook und _keybd_event nicht. Wann werden die denn aufgerufen? Geschieht das irgendwie vom System her?
Hab natürlich auch schon die Hilfen zu den einzelnen DLL Funktionen gelesen, damit komm ich eigentlich klar, ich muss die Parameter halt nachlesen.

Ich hoffe es erbarmt sich jemand.