Funktionsreferenz


_WinAPI_SetWindowsHookEx

Fügt einen von der Anwendung erstellten Hook in die Hook-Kette ein

#include <WinAPI.au3>
_WinAPI_SetWindowsHookEx($idHook, $lpfn, $hmod [, $dwThreadId = 0])

Parameter

$idHook 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 - Windows 2000/XP: Empfängt Tastatur-Codes
$WH_MOUSE - Empfängt allgemeine Mausnachrichten
$WH_MOUSE_LL - Windows 2000/XP: 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ü
$lpfn Zeiger zur Hook-Prozedur. Wenn der $dwThreadId-Parameter null ist oder auf einen Thread verweist, der durch einen anderen Prozess erzeugt wurde,
muss der $lpfn-Parameter auf eine Hook-Prozedur in einer Dll verweisen.
Andernfalls kann $lpfn auf eine Hook-Prozedur im Code des aktuellen Prozesses verweisen.
$hmod Handle zur Dll, die jene Hook-Prozedur enthält, auf die der $lpfn-Parameter verweist.
Der $hMod-Parameter muss null sein, wenn $dwThreadId eine vom aktuellen Prozess erzeugte Thread-ID enthält oder wenn sich der Code der Hook-Prozedur innerhalb des aktuellen Prozesses befindet.
$dwThreadId [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.

Rückgabewert

Erfolg: Handle zur Hook-Prozedur
Fehler: 0 und @error wird gesetzt

Bemerkungen

Keine.

Verwandte Funktionen

_WinAPI_UnhookWindowsHookEx, _WinAPI_CallNextHookEx, DllCallbackRegister, DllCallbackGetPtr, DllCallbackFree

Siehe auch

Suche in der MSDN Bibliothek nach SetWindowsHookEx

Beispiel


#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <StructureConstants.au3>

Global $hHook, $hStub_KeyProc, $buffer = ""

_Main()

Func _Main()
    OnAutoItExitRegister("Cleanup")

    Local $hmod

    $hStub_KeyProc = DllCallbackRegister("_KeyProc", "long", "int;wparam;lparam")
    $hmod = _WinAPI_GetModuleHandle(0)
    $hHook = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, DllCallbackGetPtr($hStub_KeyProc), $hmod)

    MsgBox(4096, "", "Klicke OK, dann gib im Editor (Notepad) ein:" & _
            @LF & @LF & "Jon" & @LF & "AutoIt" & @LF & @LF & "Drücke ESC zum Beenden des Skripts." & @LF & "(Das Editorfenster darfst du selber schließen!)")

    Run("notepad.exe")
    WinWait("[CLASS:Notepad]")
    WinActivate("[CLASS:Notepad]")

    While 1
        Sleep(10)
    WEnd
EndFunc   ;==>_Main

Func EvaluateKey($keycode)
    If (($keycode > 64) And ($keycode < 91)) _ ; A - z
            Or (($keycode > 96) And ($keycode < 123)) _ ; A - Z
            Or (($keycode > 47) And ($keycode < 58)) Then ; 0 - 9
        $buffer &= Chr($keycode)
        Switch $buffer
            Case "Jon"
                ToolTip("Was würdest du sagen?")
            Case "AutoIt"
                ToolTip("AutoIt ist genial!")
        EndSwitch
    ElseIf ($keycode > 159) And ($keycode < 164) Then
        Return
    ElseIf ($keycode = 27) Then ; ESC-Taste
        Exit
    Else
        $buffer = ""
    EndIf
EndFunc   ;==>EvaluateKey

;===========================================================
; Callback-Funktion
;===========================================================
Func _KeyProc($nCode, $wParam, $lParam)
    Local $tKEYHOOKS
    $tKEYHOOKS = DllStructCreate($tagKBDLLHOOKSTRUCT, $lParam)
    If $nCode < 0 Then
        Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
    EndIf
    If $wParam = $WM_KEYDOWN Then
        EvaluateKey(DllStructGetData($tKEYHOOKS, "vkCode"))
    Else
        Local $flags = DllStructGetData($tKEYHOOKS, "flags")
        Switch $flags
            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($hHook, $nCode, $wParam, $lParam)
EndFunc   ;==>_KeyProc

Func Cleanup()
    _WinAPI_UnhookWindowsHookEx($hHook)
    DllCallbackFree($hStub_KeyProc)
EndFunc   ;==>Cleanup