Функция _WinAPI_SetWindowsHookEx

 ↑  ←  Описание функции


_WinAPI_SetWindowsHookEx

Устанавливает определяемое программой хук-процедуру в цепочку хуков

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

Параметры

$idHook Указывает тип устанавливаемой хук-процедуры. Этот параметр может быть одним из следующих значений:
    $WH_CALLWNDPROC - устанавливает хук-процедуру, которая отслеживает сообщения, прежде чем система отправляет их в назначенную процедуру окна
    $WH_CALLWNDPROCRET - устанавливает хук-процедуру, которая отслеживает сообщения после того, как они были обработаны в назначенной процедуре окна
    $WH_CBT - устанавливает хук-процедуру, которая принимает уведомления, полезные для приложений компьютерного обучения (Computer-Based Training (CBT))
    $WH_DEBUG - устанавливает хук-процедуру, полезную для отладки других хук-процедур
    $WH_FOREGROUNDIDLE - устанавливает хук-процедуру, которая вызывается при бездействии приложения находящегося на переднем плане.
    $WH_GETMESSAGE - устанавливает хук-процедуру, которая отслеживает сообщения, размещенные в очереди сообщений
    $WH_JOURNALPLAYBACK - устанавливает хук-процедуру, которая вставляет сообщение, ранее записанное хук-процедурой $WH_JOURNALRECORD
    $WH_JOURNALRECORD - устанавливает хук-процедуру, которая записывает входящие сообщения, вставленные в очередь системных сообщений
    $WH_KEYBOARD - устанавливает хук-процедуру, которая отслеживает сообщения нажатия клавиш
    $WH_KEYBOARD_LL - Windows 2000/XP: устанавливает хук-процедуру, которая отслеживает низкоуровневые входящие клавиатурные события
    $WH_MOUSE - устанавливает хук-процедуру, которая отслеживает сообщения мыши
    $WH_MOUSE_LL - Windows 2000/XP: устанавливает хук-процедуру, которая отслеживает низкоуровневые входящие события мыши
    $WH_MSGFILTER - устанавливает хук-процедуру, которая отслеживает сообщения возникающие в результате входящих событий диалогового окна, окна сообщения, меню, полосы прокрутки
    $WH_SHELL - устанавливает хук-процедуру, которая принимает уведомления полезные для оболочки приложения
    $WH_SYSMSGFILTER - устанавливает хук-процедуру, которая отслеживает сообщения возникающие в результате входящих событий диалогового окна, окна сообщения, меню, полосы прокрутки
$lpfn Указатель на хук-процедуру. Если параметр $dwThreadId равен 0 или указывает идентификатор потока созданный другим процессом, то параметр $lpfn должен указывать на хук-процедуру в DLL.
    Иначе, $lpfn может указывать на хук-процедуру в коде, связанным с текущим процессом
$hmod Дескриптор DLL содержащий хук-процедуру указывающий на параметр $lpfn.
    Параметр $hMod должен установлен в NULL, если параметр $dwThreadId указывает поток созданный текущим процессом и если хук-процедура находится в пределах кода, связанного с текущим процессом
$dwThreadId [необязательный] Указывает идентификатор потока, с которым хук-процедура должна быть связана.
    Если этот параметр 0, то хук-процедура связана со всеми существующими потоками, запущенными на том же рабочем столе, что и вызванный поток

Возвращаемое значение

Успех:Возвращает дескриптор хук-процедуры
Ошибка:Возвращает 0 и устанавливает @error

См. также

_WinAPI_UnhookWindowsHookEx, _WinAPI_CallNextHookEx, DllCallbackRegister, DllCallbackGetPtr, DllCallbackFree

См. также

Искать SetWindowsHookEx в библиотеке MSDN

Пример

#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, "", "Click OK, then in notepad type..." & _
            @LF & @LF & "Jon" & @LF & "AutoIt" & @LF & @LF & "Press Esc to exit script")

    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("What can you say?")
            Case "AutoIt"
                ToolTip("AutoIt Rocks")
        EndSwitch
    ElseIf ($keycode > 159) And ($keycode < 164) Then
        Return
    ElseIf ($keycode = 27) Then ; esc key
        Exit
    Else
        $buffer = ""
    EndIf
EndFunc   ;==>EvaluateKey

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