您的位置:首页 > 其它

关于SetWindowsHookEx【HOOK钩子】

2009-04-11 10:28 411 查看
请问如果我只想获得当前的键盘输入,最简单的办法是什么呢?如果只使用Win SDK的话。
我是用的console程序。
谢谢,请给举个例子

----------------------------------------------------------------------

做一个全局的DLL,然后DLL里面调用SetWindowsHook就可以了。这个和console没有关系哈。

--------------------------------------------------------

BOOL CKeyboardHook::StartHook()
{
BOOL bResult=FALSE;
glhHook=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,glhInstance,0);
/*============================================================
HHOOK SetWindowsHookEx( int idHook,HOOKPROC lpfn, INSTANCE hMod,DWORD dwThreadId )
参数idHook表示钩子类型,它是和钩子函数类型一一对应的。
比如,WH_KEYBOARD表示安装的是键盘钩子,WH_MOUSE表示是鼠标钩子等等。
注:WH_KEYBOARD=2,WH_JOURNALRECORD=1,WH_JOURNALPLAYBACK=0

Lpfn是钩子函数的地址。

HMod是钩子函数所在的实例的句柄。对于线程钩子,该参数为NULL;对于系统钩子,
该参数为钩子函数所在的DLL句柄。

dwThreadId 指定钩子所监视的线程的线程号。对于全局钩子,该参数为NULL。

SetWindowsHookEx返回所安装的钩子句柄。
值得注意的是线程钩子和系统钩子的钩子函数的位置有很大的差别。
线程钩子一般在当前线程或者当前线程派生的线程内,
而系统钩子必须放在独立的动态链接库中,实现起来要麻烦一些。
===========================================================*/
if(glhHook!=NULL)
bResult=TRUE;
return bResult;
}

LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{

return CallNextHookEx( glhHook, nCode, wParam, lParam );
}

--------------------------------------------------------

我的博客上最近发表了一篇关于Windows挂钩简单使用的文章,实现的功能是复制另一个进程中一个ListView控件的内容到自己进程中的控件中。我那里使用的是消息挂钩,我想键盘挂钩的使用方法应该是类似的。欢迎去访问我的博客http://blog.sina.com.cn/yaozj,阅读那篇文章,但愿能对你有一定的参考价值(文章提及的程序的源代码在我的网络硬盘上提供下载的)

--------------------------------------------------------

拜读中。。。

--------------------------------------------------------

系统钩子必须放在独立的动态链接库中??那就必须封装成DLL?
如果是console程序的话,那就不用了吧?
请问怎么得到console程序的HINSTANCE呢?

--------------------------------------------------------

WH_KEYBOARD做成全局钩子必须放在Dll中
WH_KEYBOARD_LL不必

--------------------------------------------------------

GetModuleHandle

--------------------------------------------------------

钩子必须放在动态链接库中的,因为钩子函数要在目标进程(要从其中截取消息的进程)中运行,只有动态链接库才能动态映射到目标进程,目标进程无法执行自己以外的进程中的代码(钩子函数)。控制台程序也可以使用动态链接库的,因为控制台程序也是windows程序,当然也可以使用windows系统提供的功能。
取得HINSTANCE的方法:GetModuleHandle,给出参数NULL时,取得EXE模块句柄。如果是隐含链接到dll的,可以用GetModuleHandle("Dll文件名")的方法取得dll模块句柄(dll文件名好像不能带扩展名)
要注意的是,含有钩子函数的dll是被映射到两个进程中的(你的进程和目标进程)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: