SetWindowHookEx全局钩子将应用程序定义的挂钩过程安装到挂钩链中。您将安装挂钩过程来监视系统中某些类型的事件。这些事件与特定线程或与调用线程同一桌面中的所有线程相关联.
idHook
要安装的挂钩过程的类型。此参数可以是以下值之一。
Value | Meaning |
---|---|
WH_CALLWNDPROC 4 | 安装一个挂钩过程,在系统将消息发送到目标窗口过程之前监视消息。有关详细信息,请参阅CallWndProc挂钩过程。 |
WH_CALLWNDPROCRET 12 | 安装一个挂钩过程,在目标窗口过程处理消息后监视它们。有关详细信息,请参阅CallWndRetProc挂钩过程。 |
WH_CBT 5 | 安装接收对 CBT 应用程序有用的通知的挂钩过程。有关详细信息,请参阅CBTProc挂钩过程。 |
WH_DEBUG 9 | 安装可用于调试其他挂钩过程的挂钩过程。有关详细信息,请参阅DebugProc挂钩过程。 |
WH_FOREGROUNDIDLE 11 | 安装应用程序前台线程即将空闲时将调用的挂钩过程。此挂钩可用于在空闲时间执行低优先级任务。有关详细信息,请参阅前景IdleProc挂钩过程。 |
WH_GETMESSAGE 3 | 安装一个挂钩过程,用于监视发布到消息队列的消息。有关详细信息,请参阅GetMsgProc挂钩过程。 |
WH_JOURNALPLAYBACK 1 | 安装一个挂钩过程,该过程会发布以前由WH_JOURNALRECORD挂钩过程记录的消息。有关详细信息,请参阅日记本PlaybackProc挂钩程序。 |
WH_JOURNALRECORD 0 | 安装一个挂钩过程,用于记录发布到系统消息队列的输入消息。此挂钩可用于录制宏。有关详细信息,请参阅日记记录Proc挂钩过程。 |
WH_KEYBOARD 2 | 安装监视击键消息的挂钩过程。有关详细信息,请参阅键盘Proc挂钩过程。 |
WH_KEYBOARD_LL 13 | 安装监视低级键盘输入事件的挂钩过程。有关详细信息,请参阅低级别键盘Proc挂钩过程。 |
WH_MOUSE 7 | 安装监视鼠标消息的挂钩过程。有关详细信息,请参阅MouseProc挂钩过程。 |
WH_MOUSE_LL 14 | 安装监视低级鼠标输入事件的挂钩过程。有关详细信息,请参阅低级别鼠标Proc挂钩过程。 |
WH_MSGFILTER -1 | 安装一个挂钩过程,用于监视对话框、消息框、菜单或滚动条中输入事件生成的消息。有关详细信息,请参阅MessageProc挂钩过程。 |
WH_SHELL 10 | 安装一个挂钩过程,该过程接收对 shell 应用程序有用的通知。有关详细信息,请参阅壳牌Proc挂钩过程。 |
WH_SYSMSGFILTER 6 | 安装一个挂钩过程,用于监视对话框、消息框、菜单或滚动条中输入事件生成的消息。挂钩过程监视与调用线程位于同一桌面中的所有应用程序的这些消息。有关详细信息,请参阅SysMsgProc挂钩过程。 |
CallNextHookEx将挂钩信息传递到当前挂钩链中的下一个挂钩过程。挂钩过程可以在处理挂钩信息之前或之后调用此函数。
LRESULT CallNextHookEx(
HHOOK hhk,//此参数将被忽略
int nCode,//转接代码传递到当前挂钩过程。下一个挂钩过程使用此代码来确定如何处理挂钩信息。
WPARAM wParam,//wParam值传递给当前挂钩过程。此参数的含义取决于与当前挂钩链关联的挂钩类型。
LPARAM lParam//lParam值传递给当前挂钩过程。此参数的含义取决于与当前挂钩链关联的挂钩类型
);
WH_KEYBOARD_LL 安装监视低级键盘输入事件的挂钩过程。
HOOKPROC类型定义指向此回调函数的指针。低级别键盘Proc是应用程序定义或库定义的函数名称的占位符
LRESULT CALLBACK LowLevelKeyboardProc(
_In_ int nCode,
_In_ WPARAM wParam,
_In_ LPARAM lParam
);
键盘钩子实现
HHOOK g_Hook;
LRESULT CALLBACK LowLevelKeyboardProc(INT nCode, WPARAM wParam, LPARAM lParam)
{
KBDLLHOOKSTRUCT *pkbhs = (KBDLLHOOKSTRUCT *)lParam;
BOOL bControlKeyDown = 0;
switch (nCode)
{
case HC_ACTION:
{
// 检查是否按了ctrl键
bControlKeyDown = GetAsyncKeyState (VK_CONTROL) >> ((sizeof(SHORT) * 8) - 1);
//Disable CTRL+ESC
if (pkbhs->vkCode == VK_ESCAPE && bControlKeyDown)
return 1;
if(wParam == WM_KEYUP)
printf("%c", pkbhs->vkCode);
break;
}
}
return CallNextHookEx(g_Hook, nCode, wParam, lParam); //回调
//return 1;
}
int _tmain(int argc, _TCHAR* argv[])
{
MSG msg;
g_Hook=(HHOOK)SetWindowsHookEx(WH_KEYBOARD_LL,
(HOOKPROC)LowLevelKeyboardProc, GetModuleHandleW(0),0);
while(GetMessageW(&msg,0,0,0))DispatchMessageW(&msg);
return 0;
}