windows sdk编程系列文章20 ---- 钩子

windows sdk编程系列文章20 ---- 钩子

ID:41032598

大小:62.50 KB

页数:15页

时间:2019-08-14

windows sdk编程系列文章20 ---- 钩子_第1页
windows sdk编程系列文章20 ---- 钩子_第2页
windows sdk编程系列文章20 ---- 钩子_第3页
windows sdk编程系列文章20 ---- 钩子_第4页
windows sdk编程系列文章20 ---- 钩子_第5页
资源描述:

《windows sdk编程系列文章20 ---- 钩子》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、windowssdk编程系列文章----钩子2008-04-2217:29本课中我们将要学习WINDOWS钩子函数的使用方法。WINDOWS钩子函数的功能非常强大,有了它您可以探测其它进程并且改变其它进程的行为。理论:WINDOWS的钩子函数可以认为是WINDOWS的主要特性之一。利用它们,您可以捕捉您自己进程或其它进程发生的事件。通过“钩挂”,您可以给WINDOWS一个处理或过滤事件的回调函数,该函数也叫做“钩子函数”,当每次发生您感兴趣的事件时,WINDOWS都将调用该函数。一共有两种类型的钩子:局部的和远程的。·局部钩子仅钩挂您自己进程的事件。·远程的钩子还可

2、以将钩挂其它进程发生的事件。远程的钩子又有两种:o基于线程的它将捕获其它进程中某一特定线程的事件。简言之,就是可以用来观察其它进程中的某一特定线程将发生的事件。o系统范围的将捕捉系统中所有进程将发生的事件消息。安装钩子函数将会影响系统的性能。监测“系统范围事件”的系统钩子特别明显。因为系统在处理所有的相关事件时都将调用您的钩子函数,这样您的系统将会明显的减慢。所以应谨慎使用,用完后立即卸载。还有,由于您可以预先截获其它进程的消息,所以一旦您的钩子函数出了问题的话必将影响其它的进程。记住:功能强大也意味着使用时要负责任。在正确使用钩子函数前,我们先讲解钩子函数的工作原

3、理。当您创建一个钩子时,WINDOWS会先在内存中创建一个数据结构,该数据结构包含了钩子的相关信息,然后把该结构体加到已经存在的钩子链表中去。新的钩子将加到老的前面。当一个事件发生时,如果您安装的是一个局部钩子,您进程中的钩子函数将被调用。如果是一个远程钩子,系统就必须把钩子函数插入到其它进程的地址空间,要做到这一点要求钩子函数必须在一个动态链接库中,所以如果您想要使用远程钩子,就必须把该钩子函数放到动态链接库中去。当然有两个例外:工作日志钩子和工作日志回放钩子。这两个钩子的钩子函数必须在安装钩子的线程中。原因是:这两个钩子是用来监控比较底层的硬件事件的,既然是记录

4、和回放,所有的事件就当然都是有先后次序的。所以如果把回调函数放在DLL中,输入的事件被放在几个线程中记录,所以我们无法保证得到正确的次序。故解决的办法是:把钩子函数放到单个的线程中,譬如安装钩子的线程。钩子一共有14种,以下是它们被调用的时机:·WH_CALLWNDPROC当调用SendMessage时·WH_CALLWNDPROCRET当SendMessage的调用返回时·WH_GETMESSAGE当调用GetMessage或PeekMessage时·WH_KEYBOARD当调用GetMessage或PeekMessage来从消息队列中查询WM_KEYUP或WM_

5、KEYDOWN消息时·WH_MOUSE当调用GetMessage或PeekMessage来从消息队列中查询鼠标事件消息时·WH_HARDWARE当调用GetMessage或PeekMessage来从消息队列种查询非鼠标、键盘消息时·WH_MSGFILTER当对话框、菜单或滚动条要处理一个消息时。该钩子是局部的。它时为那些有自己的消息处理过程的控件对象设计的。·WH_SYSMSGFILTER和WH_MSGFILTER一样,只不过是系统范围的·WH_JOURNALRECORD当WINDOWS从硬件队列中获得消息时·WH_JOURNALPLAYBACK当一个事件从系统的硬

6、件输入队列中被请求时·WH_SHELL当关于WINDOWS外壳事件发生时,譬如任务条需要重画它的按钮.·WH_CBT当基于计算机的训练(CBT)事件发生时·WH_FOREGROUNDIDLE由WINDOWS自己使用,一般的应用程序很少使用·WH_DEBUG用来给钩子函数除错现在我们知道了一些基本的理论,现在开始讲解如何安装/卸载一个钩子。要安装一个钩子,您可以调用SetWindowHookEx函数。该函数的原型如下:HHOOKSetWindowsHookEx(intidHook,    HOOKPROClpfn,    HINSTANCEhMod,    DWORD

7、dwThreadId);·idHook是我们上面列出的值之一,譬如:WH_MOUSE,WH_KEYBOARD·lpfn是钩子函数的地址。如果使用的是远程的钩子,就必须放在一个DLL中,否则放在本身代码中·hMod钩子函数所在DLL的实例句柄。如果是一个局部的钩子,该值为NULL·dwThreadId是您安装该钩子函数后想监控的线程的ID号。该参数可以决定该钩子是局部的还是系统范围的。如果该值为NULL,那么该钩子将被解释成系统范围内的,那它就可以监控所有的进程及它们的线程。如果您指定了您自己进程中的某个线程ID号,那该钩子是一个局部的钩子。如果该线程ID是另一个

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。