Funktionreferenz


_WinAPI_SetWindowsHookEx

Beschreibung anzeigen in

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

#include <WinAPISys.au3>
_WinAPI_SetWindowsHookEx ( $iHook, $pProc, $hDll [, $iThreadId = 0] )

Parameter

$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.

Rückgabewert

Erfolg: Handle zur Hook-Prozedur
Fehler: 0. Es ist _WinAPI_GetLastError() aufzurufen um erweiterte Fehlerinformationen zu erhalten

Verwandte Funktionen

_WinAPI_CallNextHookEx, _WinAPI_UnhookWindowsHookEx

Siehe auch

Suche nach SetWindowsHookEx in der MSDN Bibliothek.

Beispiel

#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