UDF > WinAPIEx > System > Automation >


_WinAPI_SetWindowsHookEx

Installe une procédure hook définie par une application, dans une chaîne hook

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

Paramètres

$iHook Spécifie le type de procédure hook à installer. Ce paramètre peut prendre l'une des valeurs suivantes:
    $WH_CALLWNDPROC - Installe une procédure hook qui surveille les messages avant que le système les envoie à la procédure de fenêtre de destination
    $WH_CALLWNDPROCRET - Installe une procédure de hook qui surveille les messages après qu'ils aient été traités par la procédure de fenêtre de destination
    $WH_CBT - Installe une procédure hook qui reçoit les notifications utiles à une application CBT (Computer Based Training)
    $WH_DEBUG - Installe une procédure hook utile pour le débogage d'autres procédures hook
    $WH_FOREGROUNDIDLE - Installe une procédure hook qui sera appelée lorsque le thread de premier plan de l'application est en passe de devenir inactif
    $WH_GETMESSAGE - Installe une procédure hook qui surveille les messages postés dans la file de messages
    $WH_JOURNALPLAYBACK - Installe une procédure hook qui poste des messages précédemment enregistrés par la procédure hook $WH_JOURNALRECORD
    $WH_JOURNALRECORD - Installe une procédure hook qui enregistre les messages d'entrée postés dans la file d'attente des messages du système
    $WH_KEYBOARD - Installe une procédure hook qui surveille les messages de frappe
    $WH_KEYBOARD_LL - Installe une procédure hook qui surveille les événements d'entrée du clavier de bas niveau
    $WH_MOUSE - Installe une procédure hook qui surveille les messages souris
    $WH_MOUSE_LL - Installe une procédure hook qui surveille les événements d'entrée de bas niveau de la souris
    $WH_MSGFILTER - Installe une procédure hook qui surveille les messages générés à la suite d'un événement d'entrée dans une boîte de dialogue, une boîte de message, un menu ou une barre de défilement
    $WH_SHELL - Installe une procédure hook qui reçoit les notifications utiles à des applications shell
    $WH_SYSMSGFILTER - Installe une procédure hook qui surveille les messages générés à la suite d'un événement d'entrée dans une boîte de dialogue, une boîte de message, un menu ou une barre de défilement
$pProc Pointeur vers la procédure hook. Si le paramètre $iThreadID est zéro ou spécifie l'identifiant d'un thread créé par un processus différent, le paramètre $pProc doit pointer vers une procédure hook dans une DLL.
Dans le cas contraire, $pProc peut pointer vers une procédure hook dans le code associé au processus en cours
$hDll Handle d'une DLL contenant la procédure hook pointée par le paramètre $pProc.
Le paramètre $hMod doit être défini à NULL si le paramètre $iThreadID spécifie un thread créé par le processus actuel et si la procédure hook est dans le code associé au processus en cours
$iThreadID [optionnel] Spécifie l'identifiant du thread avec lequel la procédure hook doit être associée.
Si ce paramètre est égal à zéro, la procédure hook est associée à toutes les threads existants en cours d'exécution dans le même bureau que le thread appelant

Valeur de retour

Succès: Retourne le handle de la procédure hook
Échec: Retourne 0, appelez _WinAPI_GetLastError() pour obtenir des informations supplémentaires sur l'erreur.

En relation

_WinAPI_CallNextHookEx, _WinAPI_UnhookWindowsHookEx

Voir aussi

Consultez SetWindowsHookEx dans la librairie MSDN.

Exemple

#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, "", "Cliquez sur OK, puis dans notepad tapez..." & _
            @CRLF & @CRLF & "Jon" & @CRLF & "AutoIt" & @CRLF & @CRLF & "Pressez Esc pour arrêter le script")

    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("Que voulez-vous dire?")
            Case "AutoIt"
                ToolTip("AutoIt Rocks")
        EndSwitch
    ElseIf ($iKeycode > 159) And ($iKeycode < 164) Then
        Return
    ElseIf ($iKeycode = 27) Then ; touche esc
        Exit
    Else
        $g_sBuffer = ""
    EndIf
EndFunc   ;==>EvaluateKey

;================================================== =========
; Fonction de rappel
;================================================== =========
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: scanCode - " & DllStructGetData($tKEYHOOKS, "scanCode") & @TAB & "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