关于SetWindowsHookEx【HOOK钩子】

请问如果我只想获得当前的键盘输入,最简单的办法是什么呢?如果只使用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是被映射到两个进程中的(你的进程和目标进程)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值