作者 : 卿笃军
系统钩子:钩子可以监视系统或进程中的各种事件消息,截获发往目标窗口的消息并进行处理。这样,我们就可以在系统中安装自定义的钩子,监视系统中特定事件的发生,完成特定的功能,比如截获键盘、鼠标的输入,屏幕取词,日志监视等等。
下面演示如何安装进程内键盘钩子:
第一步:打开VC6.0,创建一个基于对话框的MFC应用程序。
第二步:在BOOL CHookDlg::OnInitDialog()函数上面编写如下代码:(注意是在上面编写,不是在OnInitDialog()里面)
HHOOK g_hKeyboard = NULL; LRESULT CALLBACK KeyboardProc(int ncode, WPARAM wParam, LPARAM lParam) { return 1; }
第三步:在OnInitDialog()函数里面安装键盘钩子,复制粘贴如下代码:
g_hKeyboard = SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,NULL,GetCurrentThreadId());
第四步:编译->链接->运行:这时候你发现键盘事件已经不能响应了~~~
当然,如果你只想屏蔽掉空格键,你可以这样写:
LRESULT CALLBACK KeyboardProc(int ncode, WPARAM wParam, LPARAM lParam) { if (VK_SPACE == wParam) return 1; else return CallNextHookEx(g_hKeyboard, ncode, wParam, lParam); }
如果按下的是空格键,直接返回,告诉系统,该消息已执行。否则将消息传给下一个钩子~~~
还有一种就是,需要屏蔽一些组合键,比如:Alt+F4,可以用如下方式实现:
LRESULT CALLBACK KeyboardProc(int ncode, WPARAM wParam, LPARAM lParam) { if (VK_F4 == wParam || (1 == (lParam>>29 & 1))) return 1; else return CallNextHookEx(g_hKeyboard, ncode, wParam, lParam); }
lParam参数各位的含义:
0-15位:指定当前消息的重复次数。其值就是用户按下该键后自动重复的次数,但是重复次数不累积。
16-23位:指定其扫描码,其值依赖于OEM厂商。
24位:指定该按键是否为扩展按键,所谓扩展按键就是Ctrl,Alt之类的,如果是扩展按键,其值为1,否则为0。
25-28位:保留字段,暂时不可用。
29位:指定按键时的上下文,其值为1时表示在按键时Alt键被按下,其值为0表示WM_SYSKEYDOWN消息因没有任何窗口有键盘焦点而被发送到当前活动窗口。
30位:指定该按键之前的状态,其值为1时表示该消息发送前,该按键是被按下的,其值为0表示该消息发送前该按键是抬起的。
31位:指定其转换状态,对WM_SYSKEYDOWN消息而言,其值总为0。
参考文献:模拟键盘鼠标按键,http://m.blog.csdn.net/blog/Plutus_Lee/16993445
钩子编程(HOOK) 安装进程内键盘钩子