Fügt einen von der Anwendung erstellten Hook in die Hook-Kette ein
#include <WinAPISys.au3>
_WinAPI_SetWindowsHookEx ( $iHook, $pProc, $hDll [, $iThreadId = 0] )
$iHook | Legt den Typ der Hook-Prozedur fest. Das kann einer der folgenden Werte sein: $WH_CALLWNDPROC - Empfängt Nachrichten, bevor sie zum Empfängerfenster gesendet werden $WH_CALLWNDPROCRET - Empfängt Nachrichten, nachdem sie vom Empfängerfenster bearbeitet wurden $WH_CBT - Empfängt Nachrichten, die für Lernzwecke wichtig sind (CBT-Notification) $WH_DEBUG - Empfängt Nachrichten, die zur Fehlersuche verwendet werden $WH_FOREGROUNDIDLE - Empfängt Nachrichten, wenn der Haupt-Thread der Anwendung unbeschäftigt ist $WH_GETMESSAGE - Empfängt alle Nachrichten, die an eine andere Nachrichtenwarteschlange gesendet wurden $WH_JOURNALPLAYBACK - Sendet Nachrichten, die vorher per $WH_JOURNALRECORD-Hook abgefangen wurden $WH_JOURNALRECORD - Zeichnet alle Eingabenachrichten auf, die an die System-Nachrichtenbearbeitung gesendet werden $WH_KEYBOARD - Empfängt Tastatureingaben $WH_KEYBOARD_LL - Empfängt Tastatur-Codes $WH_MOUSE - Empfängt allgemeine Mausnachrichten $WH_MOUSE_LL - Empfängt Maus-Eingabenachrichten (low level) $WH_MSGFILTER - Empfängt Nachrichten aus einer Aktion in einer Dialogbox, MessageBox, Scrollbar oder einem Menü $WH_SHELL - Empfängt Nachrichten, die für Kommandozeilenanwendungen von Bedeutung sein können $WH_SYSMSGFILTER - Empfängt Nachrichten aus einer Aktion in einer Dialogbox, MessageBox, Scrollbar oder einem Menü |
$pProc | Zeiger zur Hook-Prozedur. Wenn der $iThreadId-Parameter null ist oder auf einen Thread verweist, der durch einen anderen Prozess erzeugt wurde, muss der $pProc-Parameter auf eine Hook-Prozedur in einer Dll verweisen. Andernfalls kann $pProc auf eine Hook-Prozedur im Code des aktuellen Prozesses verweisen. |
$hDll | Handle zur Dll, die jene Hook-Prozedur enthält, auf die der $pProc-Parameter verweist. Der $hMod-Parameter muss null sein, wenn $iThreadId eine vom aktuellen Prozess erzeugte Thread-ID enthält oder wenn sich der Code der Hook-Prozedur innerhalb des aktuellen Prozesses befindet. |
$iThreadId | [optional] Gibt den Identifier des Threads an, mit dem die Hook-Prozedur verbunden ist. Wenn dieser Parameter null ist, wird die Hook-Prozedur allen Threads zugewiesen, die im selben Arbeitsbereich des aufrufenden Threads laufen. |
Erfolg: | Handle zur Hook-Prozedur |
Fehler: | 0. Es ist _WinAPI_GetLastError() aufzurufen um erweiterte Fehlerinformationen zu erhalten |
_WinAPI_CallNextHookEx, _WinAPI_UnhookWindowsHookEx
Suche nach SetWindowsHookEx in der MSDN Bibliothek.
#include <MsgBoxConstants.au3>
#include <StructureConstants.au3>
#include <WinAPIConstants.au3>
#include <WinAPISys.au3>
#include <WindowsConstants.au3>
Global $g_hHook, $g_hStub_KeyProc, $g_sBuffer = ""
Example()
Func Example()
OnAutoItExitRegister("Cleanup")
Local $hMod
$g_hStub_KeyProc = DllCallbackRegister("_KeyProc", "long", "int;wparam;lparam")
$hMod = _WinAPI_GetModuleHandle(0)
$g_hHook = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, DllCallbackGetPtr($g_hStub_KeyProc), $hMod)
MsgBox($MB_SYSTEMMODAL, "", "Klicke OK, dann gib im Editor (Notepad) ein:" & _
@CRLF & @CRLF & "Jon" & @CRLF & "AutoIt" & @CRLF & @CRLF & "Drücke ESC zum Beenden des Skripts." & @CRLF & "(Das Editorfenster darfst du selber schließen!)")
Run("notepad.exe")
WinWait("[CLASS:Notepad]")
WinActivate("[CLASS:Notepad]")
While 1
Sleep(10)
WEnd
EndFunc ;==>Example
Func EvaluateKey($iKeycode)
If (($iKeycode > 64) And ($iKeycode < 91)) _ ; A - z
Or (($iKeycode > 96) And ($iKeycode < 123)) _ ; A - Z
Or (($iKeycode > 47) And ($iKeycode < 58)) Then ; 0 - 9
$g_sBuffer &= Chr($iKeycode)
Switch $g_sBuffer
Case "Jon"
ToolTip("Was würdest du sagen?")
Case "AutoIt"
ToolTip("AutoIt ist genial!")
EndSwitch
ElseIf ($iKeycode > 159) And ($iKeycode < 164) Then
Return
ElseIf ($iKeycode = 27) Then ; ESC-Taste
Exit
Else
$g_sBuffer = ""
EndIf
EndFunc ;==>EvaluateKey
;===========================================================
; Callback-Funktion
;===========================================================
Func _KeyProc($nCode, $wParam, $lParam)
Local $tKEYHOOKS
$tKEYHOOKS = DllStructCreate($tagKBDLLHOOKSTRUCT, $lParam)
If $nCode < 0 Then
Return _WinAPI_CallNextHookEx($g_hHook, $nCode, $wParam, $lParam)
EndIf
If $wParam = $WM_KEYDOWN Then
EvaluateKey(DllStructGetData($tKEYHOOKS, "vkCode"))
Else
Local $iFlags = DllStructGetData($tKEYHOOKS, "flags")
Switch $iFlags
Case $LLKHF_ALTDOWN
ConsoleWrite("$LLKHF_ALTDOWN" & @CRLF)
Case $LLKHF_EXTENDED
ConsoleWrite("$LLKHF_EXTENDED" & @CRLF)
Case $LLKHF_INJECTED
ConsoleWrite("$LLKHF_INJECTED" & @CRLF)
Case $LLKHF_UP
ConsoleWrite("$LLKHF_UP: Tastencode (scanCode) - " & DllStructGetData($tKEYHOOKS, "scanCode") & @TAB & " Virtueller Tastencode (vkCode) - " & DllStructGetData($tKEYHOOKS, "vkCode") & @CRLF)
EndSwitch
EndIf
Return _WinAPI_CallNextHookEx($g_hHook, $nCode, $wParam, $lParam)
EndFunc ;==>_KeyProc
Func Cleanup()
_WinAPI_UnhookWindowsHookEx($g_hHook)
DllCallbackFree($g_hStub_KeyProc)
EndFunc ;==>Cleanup