



全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
钩子的安装与卸载系统是通过调用位于钩子链表最开始处的钩子函数而进行消息拦截处理的,因此在设置钩子时要把回调函数放置于钩子链表的链首,操作系统会使其首先被调用。由函数SetWindowsHookEx()负责将回调函数放置于钩子链表的开始位置。SetWindowsHookEx()函数原型声明为:HHOOK SetWindowsHookEx(int idHook;HOOKPROC lpfn;HINSTANCE hMod;DWORD dwThreadId);其中,参数idHook 指定了钩子的类型,可以使用的类型有以下13种:WH_CALLWNDPROC 系统将消息发送到指定窗口之前的“钩子” WH_CALLWNDPROCRET 消息已经在窗口中处理的“钩子” WH_CBT 基于计算机培训的“钩子” WH_DEBUG 差错“钩子” WH_FOREGROUNDIDLE 前台空闲窗口“钩子” WH_GETMESSAGE 接收消息投递的“钩子” WH_JOURNALPLAYBACK 回放以前通过WH_JOURNALRECORD“钩子”记录的输入消息 WH_JOURNALRECORD 输入消息记录“钩子” WH_KEYBOARD 键盘消息“钩子” WH_MOUSE 鼠标消息“钩子” WH_MSGFILTER 对话框、消息框、菜单或滚动条输入消息“钩子” WH_SHELL 外壳“钩子” WH_SYSMSGFILTER 系统消息“钩子” 参数lpfn为指向钩子函数的指针,也即回调函数的首地址;参数hMod标识了钩子处理函数所处模块的句柄;参数dwThreadId 指定被监视的线程,如果明确指定了某个线程的ID就只监视该线程,此时的钩子即为线程钩子;如果该参数被设置为0,则表示此钩子为监视系统所有线程的全局钩子。此函数在执行完后将返回一个钩子句柄。在SetWindowsHookEx()函数完成对钩子的安装后,如果被监视的事件发生,系统会立即调用位于相应钩子链表开始处的钩子函数进行处理,每一个钩子函数在进行处理时都要考虑是否需要把事件传递给下一个钩子处理函数。如果需要传递,就要调用函数CallNestHookEx()。尽管在理论上不调用CallNestHookEx()也并不算错,但在实际使用时还是强烈建议无论是否需要进行事件传递都要在过程的最后调用一次CallNextHookEx( ),否则将会引起一些无法预知的系统行为或是系统锁定。该函数将返回位于钩子链表中的下一个钩子处理过程的地址,至于具体的返回值类型则要视所设置的钩子类型而定。CallNextHookEx( )的函数原型为:LRESULT CallNextHookEx(HHOOK hhk;int nCode;WPARAM wParam;LPARAM lParam);其中,参数hhk为由SetWindowsHookEx()函数返回的当前钩子句柄;参数nCode为传给钩子过程的事件代码;参数wParam和lParam 则为传给钩子处理函数的参数值,其具体含义同设置的钩子类型有关。由于安装钩子对系统的性能有一定的影响,所以在钩子使用完毕后应及时将其卸载以释放其所占资源。释放钩子的函数为UnhookWindowsHookEx(),该函数比较简单只有一个参数用于指定此前由SetWindowsHookEx()函数所返回的钩子句柄,原型声明如下:BOOL UnhookWindowsHookEx(HHOOK hhk);使用鼠标钩子由于系统全局钩子在功能上完全覆盖了线程局部钩子,因此其实际使用范围要远比线程局部钩子广泛的多。本节也由此着重对系统全局钩子的使用进行介绍。鼠标钩子是钩子中比较常用也是使用比较简单的一类钩子。下面给出的应用示例将通过安装鼠标全局钩子来捕获鼠标当前所处窗口的窗口标题。由于本例程使用了全局钩子,因此首先构造全局钩子的载体动态链接库。考虑到Win32 DLL与Win16 DLL存在的差别,在Win32环境下要在多个进程间共享数据,就必须采取一些措施将待共享的数据提取到一个独立的数据段,并通过def文件将其属性设置为读写共享:#pragma data_seg(mydata)HWND glhPrevTarWnd = NULL; / 上次鼠标所指的窗口句柄HWND glhDisplayWnd = NULL; / 显示目标窗口标题编辑框的句柄HWND glhHook = NULL; / 安装的鼠标钩子句柄HINSTANCE glhInstance = NULL; / DLL实例句柄#pragma data_seg()SECTIONS / def文件中将数据段TestData设置为读写共享TestData READ WRITE SHARED在完成上述准备工作后,在动态库输出函数StartHook()中调用SetWindowsHookEx()函数完成对全局鼠标钩子的安装,设定鼠标钩子函数为MouseProc(),安装函数返回的钩子句柄保存于变量glhHook中:BOOL CMouseHook:StartHook(HWND hWnd)BOOL result = FALSE;/ 安装钩子glhHook = (HWND)SetWindowsHookEx(WH_MOUSE, MouseProc, glhInstance, 0);if (glhHook != NULL)result = TRUE;glhDisplayWnd = hWnd; / 设置显示目标窗口标题编辑框的句柄 return result;在鼠标钩子安装完毕后,系统内的任何鼠标动作所发出的鼠标消息均要经过钩子函数MouseProc()的拦截过滤处理。在此进行的处理是通过获取当前鼠标所在位置下的窗口句柄,并以此进一步得到窗口标题。在处理完成后,调用CallNextHookEx()函数将本事件传递到钩子链表中的下一个钩子函数:LRESULT WINAPI MouseProc(int nCode, WPARAM wParam, LPARAM lParam)LPMOUSEHOOKSTRUCT pMouseHook = (MOUSEHOOKSTRUCT FAR *) lParam;if (nCode = 0) HWND glhTargetWnd = pMouseHook-hwnd; / 取目标窗口句柄 HWND ParentWnd = glhTargetWnd; while (ParentWnd != NULL)glhTargetWnd = ParentWnd; ParentWnd = GetParent(glhTargetWnd); / 取应用程序主窗口句柄 if (glhTargetWnd != glhPrevTarWnd) char szCaption100; GetWindowText(glhTargetWnd, szCaption, 100); / 取目标窗口标题 if (IsWindow(glhDisplayWnd) SendMessage(glhDisplayWnd, WM_SETTEXT, 0, (LPARAM)(LPCTSTR)szCaption); glhPrevTarWnd = glhTargetWnd; / 保存目标窗口 / 继续传递消息 return CallNextHookEx(HHOOK)glhHook, nCode, wParam, lParam); 此动态链接库还提供有输出函数StopHook(),调用程序通过对此函数的调用完成对先前加载钩子的卸载。在此输出函数内则是通过UnhookWindowsHookEx()函数来卸载指定钩子的:BOOL CMouseHook:StopHook()BOOL result = FALSE;if (glhHook)result = UnhookWindowsHookEx(HHOOK)glhHook); / 卸载钩子if (result) glhDisplayWnd = glhPrevTarWnd = glhH
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年互联网+信息安全行业当前竞争格局与未来发展趋势分析报告
- 2025年集成电路封装行业当前市场规模及未来五到十年发展趋势报告
- 2025年福建省莆田市城厢区中考数学适应性模拟试题含解析
- 静脉输血与输液选择题及答案
- 2025年初级护师资格考试试题及答案
- 【2025年】黑龙江省大庆市中级会计职称经济法预测试题含答案
- 2025年手术室护理实践指南知识考核试题及答案
- 2025年湖南省张家界市公共基础知识国家公务员测试卷(含答案)
- 摩托车赛车安全知识培训课件
- 摩托车基础知识培训课件课程
- 预制板粘贴碳纤维加固计算表格
- 检验科生物安全风险评估报告
- 2024年08月北京中信银行北京分行社会招考(826)笔试历年参考题库附带答案详解
- 肾囊肿-护理查房
- 混合痔的中医个案护理
- 裁床岗位职责
- GB/Z 44047-2024漂浮式海上风力发电机组设计要求
- 小学语文教法培训
- 2023年陇南市大学生退役军人专项招聘考试真题
- 2023年广西现代物流集团社会招聘笔试真题
- 大数据开发工程师招聘笔试题及解答(某世界500强集团)2025年
评论
0/150
提交评论