首页 > 代码库 > 钩子编程(HOOK) 安装进程内键盘钩子

钩子编程(HOOK) 安装进程内键盘钩子

作者 : 卿笃军


系统钩子:钩子可以监视系统或进程中的各种事件消息,截获发往目标窗口的消息并进行处理。这样,我们就可以在系统中安装自定义的钩子,监视系统中特定事件的发生,完成特定的功能,比如截获键盘、鼠标的输入,屏幕取词,日志监视等等。


下面演示如何安装进程内键盘钩子:


第一步:打开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