函数参考


_WinAPI_SetWindowsHookEx

安装应用程序定义的钩子程序到钩链

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

参数

$idHook 指定钩子程序类型的. 这个参数可以是以下值之一:
$WH_CALLWNDPROC - 安装钩子程序在消息监控之前,系统将它们发送到目标窗口程序
$WH_CALLWNDPROCRET - 安装钩子程序在消息监控之后,由目标窗口程序处理
$WH_CBT - 安装用以接收系统操作通知(CBT)的钩子程序
$WH_DEBUG - 安装一个钩子程序调试其他有用的钩子程序
$WH_FOREGROUNDIDLE - 安装一个钩子程序被调用时,将应用程序的前台线程设置为闲置
$WH_GETMESSAGE - 安装一个钩子程序, 监视消息队列的消息
$WH_JOURNALPLAYBACK - 安装一个钩子程序, 记录 $WH_JOURNALRECORD 挂钩程序以前发布的消息
$WH_JOURNALRECORD - 安装一个钩子程序, 记录发送到系统消息队列的输入信息
$WH_KEYBOARD - 安装一个钩子程序,监控击键消息
$WH_KEYBOARD_LL - Windows NT/2000/XP: 安装一个钩子程序, 可以监测低级别的键盘输入事件
$WH_MOUSE - 安装一个钩子程序, 监控鼠标消息
$WH_MOUSE_LL - Windows NT/2000/XP: 安装一个钩子程序, 监控低级别鼠标输入事件
$WH_MSGFILTER - 安装一个钩子程序, 监控输入事件产生对话框, 消息框, 菜单或滚动条消息
$WH_SHELL - 安装一个钩子程序接收有用的通知到外壳应用
$WH_SYSMSGFILTER - 安装一个钩子程序, 监控输入事件产生对话框, 消息框, 菜单或滚动条消息
$lpfn 钩子程序指针. 如果 $dwThreadId 参数为 0, 或指定一个不同的进程创建的线程标识符,
$lpfn 参数必须指向一个在 DLL 中的钩子程序.
否则, $lpfn 可以指向当前进程中相关的钩子程序代码
$hmod $lpfn 参数指向的, 包含钩子程序的 DLL 句柄.
如果 $dwThreadId 参数指定由当前进程创的一个线程, 且钩子程序与当前进程的代码相关,
$hMod 参数必须设置为 NULL
$dwThreadId [可选参数] 指定与钩子过程相关联的线程标识符.
如果此参数为 0, 钩子程序与调用线程是在同一桌面运行的所有现有线程

返回值

成功: 返回钩子程序句柄
失败: 返回 0, 并设置 @error

注意/说明

None.

相关

_WinAPI_UnhookWindowsHookEx, _WinAPI_CallNextHookEx, DllCallbackRegister, DllCallbackGetPtr, DllCallbackFree

详情参考

在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