SetWindowsHookEx功能将一个应用程序定义的钩子过程安装到一个钩子链中。应用程序安装挂接过程来监视系统的某些类型的事件。挂钩过程可以监视与特定线程或系统中所有线程相关联的事件。此函数取代SetWindowsHook功能。
HHOOK SetWindowsHookEx(
INT 【idHook】, | //安装类型的钩子 |
HOOKPROC 【lpfn】, | //钩子程序的地址 |
HINSTANCE 【HMOD】, | //应用程序实例的句柄 |
DWORD 【dwThreadId】 | //安装钩子的线程的身份 |
); |
参数
【idHook】
指定要安装的挂钩过程的类型。此参数可以是以下值之一:
值 | 描述 |
WH_CALLWNDPROC | 在系统将其发送到目标窗口过程之前,安装一个监视消息的挂接过程。有关详细信息,请参阅CallWndProc挂接过程。 |
WH_CALLWNDPROCRET | 安装一个挂钩过程,用于在目标窗口过程处理消息后监视消息。有关详细信息,请参阅CallWndRetProc挂接过程。 |
WH_CBT | 安装钩子程序,接收对基于计算机的培训(CBT)应用程序有用的通知。有关详细信息,请参阅CBTProc挂接过程。 |
WH_DEBUG | 安装一个挂钩程序,用于调试其他钩子程序。有关详细信息,请参阅DebugProc挂接过程。 |
WH_GETMESSAGE | 安装一个挂钩过程,监视发送到消息队列的消息。有关详细信息,请参阅GetMsgProc挂接过程。 |
WH_JOURNALPLAYBACK | 安装一个挂钩过程,用于发送先前由WH_JOURNALRECORD挂钩过程记录的消息。有关详细信息,请参阅JournalPlaybackProc挂接过程。 |
WH_JOURNALRECORD | 安装挂钩过程,记录发布到系统消息队列的输入消息。这个钩子对于记录宏是有用的。有关详细信息,请参阅JournalRecordProc挂接过程。 |
WH_KEYBOARD | 安装一个挂钩程序来监视按键消息。有关详细信息,请参阅KeyboardProc挂接过程。 |
WH_MOUSE | 安装一个监视鼠标消息的挂钩过程。有关详细信息,请参阅MouseProc挂接过程。 |
WH_MSGFILTER | 安装一个挂钩过程,用于监视由对话框,消息框,菜单或滚动条中的输入事件生成的消息。有关详细信息,请参阅MessageProc挂接过程。 |
WH_SHELL | 安装钩子程序,接收对shell应用程序有用的通知。有关详细信息,请参阅ShellProc挂接过程。 |
WH_SYSMSGFILTER | 安装一个挂钩过程,用于监视由对话框,消息框,菜单或滚动条中的输入事件生成的消息。挂钩过程监视系统中所有应用程序的这些消息。有关详细信息,请参阅SysMsgProc挂接过程。 |
【lpfn】
指向挂钩程序。如果【dwThreadId】参数为零或指定由不同进程创建的线程的标识符,则【lpfn】参数必须指向动态链接库(DLL)中的挂接过程。否则,【lpfn】可以指向与当前进程关联的代码中的挂钩过程。
【HMOD】
标识包含【lpfn】参数指向的挂接过程的DLL。【HMOD】参数必须设置为NULL,如果【dwThreadId】参数指定当前进程创建的线程,并且挂接过程是否在与当前进程关联的代码中。
【dwThreadId】
指定挂钩过程与之关联的线程的标识符。如果此参数为零,挂钩过程与所有现有线程相关联。
返回值
如果函数成功,则返回值是挂钩过程的句柄。
如果函数失败,返回值为NULL。
备注
如果【HMOD】参数为NULL且【dwThreadId】参数为零或指定由另一进程创建的线程的标识符,则可能会发生错误。
链接到下一个挂钩过程(即调用CallNextHookEx函数)是可选的。应用程序或库可以在其自己的钩子过程中的任何处理之前或之后调用下一个钩子过程。虽然链接到下一个钩是可选的,但强烈建议;否则,其他已安装钩子的应用程序将不会收到钩子通知,并可能会导致错误的行为。
在终止之前,应用程序必须调用UnhookWindowsHookEx函数来释放与该钩子相关联的系统资源。
挂钩的范围取决于挂钩类型。一些挂钩只能用系统范围设置;其他的也可以只设置一个特定的线程,如下列表所示:
钩 | 范围 |
WH_CALLWNDPROC | 线程或系统 |
WH_CBT | 线程或系统 |
WH_DEBUG | 线程或系统 |
WH_GETMESSAGE | 线程或系统 |
WH_JOURNALPLAYBACK | 仅系统 |
WH_JOURNALRECORD | 仅系统 |
WH_KEYBOARD | 线程或系统 |
WH_MOUSE | 线程或系统 |
WH_MSGFILTER | 线程或系统 |
WH_SHELL | 线程或系统 |
WH_SYSMSGFILTER | 仅系统 |
对于指定的钩子类型,首先调用线程钩子,然后调用系统钩子。
系统挂钩是一个共享资源,安装一个会影响所有应用程序。所有系统挂钩功能必须在库中。系统钩子应该限于专用应用程序,或在应用程序调试期间用作开发帮助。不再需要钩子的库应该删除挂钩过程。
也可以看看
CallNextHookEx, CallWndProc, CallWndRetProc, CBTProc, DebugProc, GetMsgProc, JournalPlaybackProc, JournalRecordProc, KeyboardProc, MouseProc, MessageProc, ShellProc, SysMsgProc, UnhookWindowsHookEx