---->***反键盘钩子,请指教!!

mdf2008 2004-02-16 01:02:53
在网上见得多关于键盘钩子监视记录键盘的资料、代码、程序,我就写个反键盘钩子程序吧。程序设计思路如下:

用WIN98+BCB6将键盘钩子程序写出来,并测试确
实能记录键盘。然后我就开始考滤如何反键盘钩
子,首先我先在网上查了一下有没有反键盘钩子
的资料,结果没有查到;在查看SDK中
SetWindowsHookEx的涵数时,我惊喜的发现在众
多的系统钩子中有一种特殊的系统钩子WH_DEBUG,
是用于调试其它钩子的特殊钩子,它会在其它钩
子调用之前被调用。我心想,只要在WH_DEBUG钩
子的回调函数中,将能记录键盘输入的钩子过滤
掉,即可实现反键盘钩子。
按照这样的思路,我把程序写了出来。并在WIN98
系统中正确运行。

整个程序的编码非常简单,没有用到很偏的技巧,
所以我认为在win2000上也能运行,后来我借朋友
同事的移动PC(win2000sp4)。程序也能运行。

但这时问题出现了,新版msdn中发现一个新类型
的钩子WH_KEYBORD_LL(在BCB6中winuser.h中有一个
常量声明:WH_KEYBORD_LL=13)它是win2000/xp
系列操作系统中新增的一种底层键盘钩子。也就
是说在win2k/xp系统中可以比WIN98系统多安装一
种记录键盘操作的钩子。但这在bcb6中的自带的
MS SDK中没有说明。

于是我修改代码,在键盘钩子程序中的新增一个
操作系统的检测,98系统安装WH_KEYBORD,
WIN2K/xp安装WH_KEYBORD_LL类型的钩子。

在写WH_KEYBORD_LL的回调函数时,由于我没有处
理好lParam指向的调试信息结构,所以导致了程
序出现异常。后来将BUG修正,键盘钩子程序能
正确运行在win2k/2003上了。

这时我又回过来修改,反键盘钩子程序中WH_DEBUG
的回调函数。 由于DEBUG钩子能调试所有的系统
钩子,会极大的影响系统的运行(调试时曾死机
N次),后来我把过滤代码改为如下:
bool b=false;
if(nCode<0 )
return CallNextHookEx(g_Hook,nCode,wParam,lParam);
if(nCode==HC_ACTION)
{
b=(wParam==WH_KEYBOARD);
b=b||(wParam==WH_JOURNALRECORD);
b=b||(wParam==WH_KEYBOARD_LL) ;
}
if (b)
return 2008;//返回非0,过滤系统监视键盘钩子
else
return CallNextHookEx(g_Hook,nCode,wParam,lParam);

这时,我测试发现,这个反键盘钩子程序在
win98下能反监视键盘钩子,在win2000下能反
WH_JOURNALRECORD类型的钩子,却不反WH_KEYBOARD_LL。
2月14日晚上我调试了两个钟头,也没有查出原因。


各位朋友请您发表发表,指教小弟一下





...全文
49 点赞 收藏 7
写回复
7 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复

还没有回复,快来抢沙发~

相关推荐
发帖
Windows SDK/API
创建于2007-08-02

1206

社区成员

C++ Builder Windows SDK/API
申请成为版主
帖子事件
创建了帖子
2004-02-16 01:02
社区公告
暂无公告