WindowsHook(钩子)函数详解.docx
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《WindowsHook(钩子)函数详解.docx》由用户(四川天地人教育)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- WindowsHook 钩子 函数 详解
- 资源描述:
-
1、Windows Hook (钩子)函数详解 目录 钩子类型 . 2 WH_MSGFILTER(MessageProc.). 2 WH_JOURNALRECORD(JournalRecordProc) .3. WH_JOURNALPLAYBACK(JournalPlaybackPro.c.). 4 WH_KEYBOARD(KeyboardProc) .6 WH_GETMESSAGE(GetMsgProc) . 8 WH_CALLWNDPROC(CallWndProc) .9 WH_CBT(CBTProc.). 10 WH_SYSMSGFILTER(SysMsgProc) .1. 3 WH_MOU
2、SE(MouseProc) . 14 WH_DEBUG (DebugProc). 15 WH_SHLL(ShellProc). 16 WH_FOREGROUNDIDLE(ForegroundIdleProc.). 17 WH_CALLWNDPROCRET(CallWndRetProc) .1. 8 WH_KEYBOARD_LL (LowLevelKeyboardProc.). 19 WH_MOUSE_LL (LowLevelMouseProc) . 21 WH_SYSMSGFILTE 和 WH_MSGFILTER (CallMsgFilter).22 相关函数 . 23 SetWindowsH
3、ookEx . 23 SetWindowsHook . 25 UnhookWindowsHookEx. 26 DelHookProc: . 26 UnhookWindowsHook . 26 CallNextHookEx. 26 钩子类型 WH_MSGFILTER(MessageProc) 函数功能: 挂钩处理过程是应用程序或库中定义的回调函数,它与函数 SetWindowsHookEx 搭配使用.当 一个对话框、消息框、菜单条、或滚动条中的输入事件发生,且由此引发的消息尚未被处理 之前,系统对此挂钩处理过程进行调用 此函数可以对一个特定应用程序或所有应用程序的对 话框、消息框、菜单条、或滚动
4、引发的条消息进行监视 类型 HOOKPROC 定义了指向此类回调函数的指针.MessageProc 是库中相应回调函数名的位 置标志符 函数原形: LRESULT CALLBACK MessageProc(i nt code,WPARAM wPara m, LPARAM IParam); 参数: nCode: 指示产生此消息的输入事件类型此参数可以是以下值之一: 若 nCode 的值小于 0,则此挂钩处理过程必须将该消息不加处理地传送给函数 CallNextHookEx 并返回其返回值 值MSGF_DDEMGR 当动态数据交换管理库(Dynamic Data Exchange Manageme
5、nt Library (DDEML)正在等待一个冋 步处理的结束时产生此事件关于DDEML的详情参见Dynamic Data Exchange Management Library . 0MSGF_DIALOGBOX输入事件由一个消息框或者对话框产生 1MSGF_MESSAGEBOX 2MSGF_MENU输入事件由一个菜单条产生 5MSGF_SCROLLBAR:输入事件由一个滚动条产生 6MSGF_NEXTWINDOW输入事件由于用户摁下组合键以激活另一个窗口而产生. 8 MSGF_MAX 4096MSGF_USER wParam: 为 NULL(O). IParam: 指向 MSG 结构的指
6、针. 返回值: 若 nCode 的值小于 0,则此挂钩处理过程必须返回 CallNextHookEx 的返回值若 nCode 的值大 于或等于 0, 并且此挂钩处理过程未对该消息进行处理,则调用函数 CallNextHookEx 并返回其 返回值是被推荐的 否则,其他安装了 WH_MSGFILTE 港钩的应用程序将无法收到此挂钩通知 并可能由此导致错误的行为 若此挂钩处理过程处理了此消息,它应返回一个非 0 值以避免系 统再将此 消息传送给挂钩链上的其他挂钩处理过程或目标窗口处理过程 备注: 一个应用程序通过调用函数SetWindowsHookEx 指定 WH_MSGFILTEF 挂钩类型和相
7、应挂钩处 理过程的首地址来安装此挂钩处理过程 若一个应用程序使用了DDEML 并实行同步处理,而且要求必须在消息被分派前处理之,则一 定要使用 WH_MSGFILTEF 挂钩. 速查: Windows NT:3.1 以及以上版本,Windows :95 以及以上版本,Windows CE 不支持,头文 件:winuser.h, 库文件:用户自定义. WH_JOURNALRECORD(JournalRecordProc) 函数功能: 该函数处理过程是应用程序或库定义的回调函数,它与函数 SetWindowsHookEx 搭配使用,此 函数纪录系统从系统消息队列中删除的消息,此后,一个应用程序可以
8、通过使用挂钩处理过程 JournalPlaybackProc 对此消息进行回调. 类型 HOOKPROC 定义了指向此类回调函数的指针,JournalRecordProc 是应用程序定义或库定 义的相应回调函数名的位置标识符. 函数原形: LRESULT CALLBACK JournalRecordProc(i nt code,WPARAM wParam,LPARAM lParam); 参数: Code: 指示如何处理此消息,此参数可以是以下值之一 HC_ACTION 参数LPARAM指向结构EVENTMSG该结构包含从系统消息队列中删除了的消息的有关 信息,此挂钩处理 过程必须纪录下此结构的
9、内容,将其拷贝到一个缓冲区或文件中. HC_SYSMODALOFF一个系统的有模式对话框正在被销毁,此挂钩处理过程必须进行纪录. HC_SYSMODALON一个系统的有模式对话框正在被显示,此挂钩处理过程必须停止纪录. 若 nCode 之值小于 0,此挂钩处理过程必须将此消息不加处理地传送给函数CallNextHookEx 并返回其返回值. wParam: 指定为 NULL(0). lParam: 指向结构 EVENTMSG 该, 结构包含将被纪录的消息 . 返回值: 返回值被忽略 . 备注 : 一个 JournalRecordProc 挂钩处理过程必须拷贝但不能修改此消息,在次挂钩处理过程控
10、制交 还给系统之后 ,此消息继续被处理 . 安 装 一 个 JournalRecordProc 挂 钩 处 理 过 程 是 通 过 调 用 函 数 SetWindowsHookEx 指 定 WH_JOURNALRECORD 挂钩类型和相应挂钩处理过程的首地址来安装此挂钩处理过程过程 并非只能存在于动态链接库中 ,一个应用程序自身也可拥有自己的 JournalRecordProc 挂钩处 理过程 与其余大多数全局挂钩处理过程不同,挂钩处理过程 JournalRecordProc 和 JournalPlaybackProc 总是在设置了该挂钩的线程上下文中被调用一个安装了 JournalRecor
11、dProc 挂钩处理过程的 应用程序该对虚拟键 VK_CANCEL 进行监视(在大多数键盘上,虚拟键 VK_CANCEL 被实现为组 合键 CTRL+BREAK此虚拟键应被应用程序解释为用户希望终止进行日志纪录的信号而应 用程序对此进行响应,结束相应的纪录序列,并删除挂钩处理过程JournalRecordProc,在这里, 删除挂钩处理过程是很重要的,此举使得应用程序免于因为在一个挂钩处理过程内部被挂起 而将系统锁住 这种作为终止日志纪录信号的角色使得组合键CTRL+BREAK 本身无法被纪录,而组合键 CTRL+C 并不充当日志纪录信号的角色,所以可以被纪录,这里还有两种组合键是不能被纪录
12、的:即 CTRL+ESC 和CTRL+ALT+DEL 这两组组合键导致系统终止所有的日志活动(纪录或回 调),删除所有的日志挂钩,并将消息 WM_CANCELJOURNAL 寄送给日志应用程序 速查 : Windows NT:3.1 以及以上版本,Windows :95 以及以上版本,Windows CE 不支持,头文 件:winuser.h,库文件:用户定义 WH_JOURNALPLAYBACK(JournalPlaybackProc) 函数功能 : 该函数处理过程是应用程序或库定义的回调函数,它与函数 SetWindowsHookEx 搭配使用 典 型地, 一个应用程序通过调用此函数来对先
13、前有JournalRecordProc 挂钩处理过程纪录的一系 列鼠标和键盘消息进行回放一旦挂钩函数 JournalPlaybackProc 挂钩处理过程被安装,则通常 的鼠标和键盘输入被禁止 类型 HOOKPROC 定义了指向此类回调函数的指针,JournalPlaybackProc 是应用程序定义或库 定义的相应回调函数名的位置标识符 函数原形: LRESULT CALLBACK JournalPlaybackProc(i nt code, WPARAM wParam, LPARAM lParam); 参数: code: 指示一个代码,被挂钩处理过程用来决定如何处理此消息,这 个 参 数
14、可 以 是 以 下 值 之 一 HC_GETNEXT挂钩处理过程必须将当前的鼠标或键盘消息拷贝至由参数lParam所指结构EVENTMSG中. HC_NOREMOVE 一个正用wRemoveMsg为参数调用了PeekMessage的应用程序对PM_NOREMOVE标志进行设置,指示此消 息在经过函数PeekMessage的处理之后并不从消息队列中被删除. HC_SKIP 此挂钩处理过程必须准备拷贝下一个鼠标或键盘消息至由参数lParam所指定的结构EVENTMSG中去,依据 收到的代码HC_GETNEXT此挂钩处理过程必须将消息拷贝至结构EVENTMSG中去. HC_SYSMODALOFF一个
15、的有系统模式对话框已被销毁,此挂钩处理过程必须恢复对此消息的回调 HC_SYSMODALON一个的有系统模式对话框正在被显示,直至此对话矿被销毁之前,此挂钩处理过程必须停止对消息的回调. 若 nCode 的值小于 0,则此挂钩函数必须返回函数CallNextHookEx 所返回的值. wParam: 指示一个 NULL(0)值 IParam: 指向一个 EVENTMSG 结构,该结构反映了正被此挂钩处理函数处理的消息,这个参数仅当参数 nCode 的值是 HC_GETNEXT 寸才有效. 返回值: 为使系统在处理此消息之前先等待一段时间,返回值必须为一个以时钟计的时间量,该时间量 指出了 系统
16、的等待时间长短.(此时间量可通过计算当前输入的消息与上一个输入消息的time 成员的差别获得),若希望立即处理此消息,返回值应为 0,此返回值仅当挂钩代码为 HC_GETNEXT 寸才 被使用,否则,此返回值被忽略. 备注: 一个 JournalPlaybackProc 挂钩处理过程应当将输入消息拷贝给lParam 参数,此消息必须是在 先前使用 JournalRecordProc 挂钩处理过程时被纪录过的,在使用 JournalRecordProc 挂钩处理 过程时, 不应对此消息进行修改,为了多次获得相同的消息,此挂钩处理过程可以多次以 HC_GETNEX为参数被调用. 若 nCode 的
17、值为 HC_GETNEX而返回值大于 0,则系统按返回值指定的毫秒值进入睡眠状态, 当系统开始继续执行时,它会以 HC_GETNEXT 为参数 nCode 的值再次调用次挂钩处理过程以 获得相 同的消息,此次调用 JournalPlaybackProc 的返回值为 0,否则,系统又将回到睡眠状态,并 以此次调用 JournalPlaybackProc 返回的毫秒数为睡眠时间,睡眠时间到后再重复上述操作.这 就使得系统表现为被 挂起 与其余大多数全局挂钩处理过程不同,挂钩处理过程 JournalRecordProc 和 JournalPlaybackProc 总是在设置了该挂钩的线程上下文中被调
18、用 在此挂钩处理过程将控制返回给系统后,此消息继续被处理若 nCode 的值为 HC_SKI 测此挂 钩处理过 程必须准备在它下一次被调用时返回下一个纪录了的事件消息,安装 JournalPlaybackProc 挂钩处理过程通过调用函数 SetWi ndowsHookEx,指定 WH_JOURNALPLAYBAC 挂钩类型及相应挂钩处理过程首地址来实现,如果用在日志回调过程 中按下Ctrl+Esc或Ctrl+Alt+Del组合键,系统将终止回调,取消此日志回调过程,并寄送一个 WM_CANCELJOURNA 消息给日志应用程序 若此挂钩处理过程返回的消息在 WM_KEYFIRST 或 WM_
19、KEYLAST 的范围内,则以下情形发生 结构 EVENTMSG 的 paramL 成员指示按下的虚拟键编码值 结构 EVENTMSG 的 paramH 成员指 示扫描吗, 这种情况下无法指示出重复按键的次数,这个事件仅表示一个按键事件 速查: Windows NT:3.1 以及以上版本,Windows :95 以及以上版本,Windows CE 不支持,头文 件:winuser.h,库文件:用户定义 WH_KEYBOARD(KeyboardProc) 函数功能: 该函数是应用程序或库文件定义的回调函数,它与函数 SetWindowsHookEx 搭配使用,当应用 程序调 用函数 GetMes
20、sage 或 PeekMessage 并且当前恰好有一个键盘消息(WM_KEYUP or WM_KEYDOWN) 将要被处理时,系统就调用此挂钩处理过程 类型 HOOKPROC 定义了指向此类回调函数的指针,KeyboardProc 是应用程序定义或库定义的 相应回调函数名的位置标识符 函数原形: LRESULT CALLBACK KeyboardProc(i nt code,LPARAM lParam); 参数: code: 指定一个代码,该代码被挂钩处理过程用于决定如何处理此消息,此 参 数 可 以 为 以 下 值 之 一 HC_ACTION参数wParam和lParam包含一个击键消息的
21、信息 HC_NOREMOVE 参数wParam and lParam包含一个击键消息的信息,并且此击键消息尚未从消息队列 中被删除(一个应用程序调用函数PeekMessage并设置了PM_NOREMOVE标志). 若 nCode 的值小于 0,则此挂钩函数必须不加处理地传送给函数CallNextHookEx,并返回其返回 值 wParam: 按键的虚拟键值消息,例如 :VK_F1 IParam: 指示重复次数,扫描码,扩展标志,上下文代码,此前的键状态标志和变化状态标志,此参数可以 是以下值的组合值: 0-15位描述:按下键盘次数。 Int16 =lParam 25-28位 保留未用. 第29
22、位 上下文键:为 1 时:ALT 按下,其他情况为 0 BOOL bAltKeyDow n = lParam 第30位如果是按键按下后发送的消息,30 位为 1,如果是按键抬起后 30 位为 0; BOOL bSe ndKeyDow n = lParam 第31位指定转变状态:31 位为 0 时候,按键正在被按下,为1 时候, 按键正在被释放 BOOL bKeyUp = lParam 欲获得更多关于此 lParam 参数的信息,请参见 Keystroke Message Flags. 返回值: 若 nCode 的值小于 0,则此挂钩函数必须返回函数CallNextHookEx 所返回的值;若
23、nCode 的值 大于或等于 0,并且此挂钩处理过程并未对此消息进行处理,我们极力推荐对函数 CallNextHookEx进行调用, 并返回其返回值.否则,其他安装了挂钩 WH_KEYBOARD 的应用程序 将无法收到挂钩通知,从而导致错 误的行为.若此挂钩处理过程对此消息进行了处理,它应返 回非 0 值以避免系统将此消息传递给挂钩键上的其他处理过程或目标窗口的处理过程 备注: 一个应用程序通过调用函数SetWindowsHookEx 指定 WH_KEYBOARD 挂钩类型和相应挂钩处 理过程的首地址来安装此挂钩处理过程. 速查: Windows NT:3.1 以及以上版本,Windows :
24、95 以及以上版本,Windows CE 不支持,头文 件:winuser.h,库文件:用户自定义. WH_GETMESSAGE(GetMsgProc) 函数功能: 该函数处理过程是应用程序或库定义的回调函数,它与函数 SetWindowsHookEx 搭配使用海 当函数 GetMessage 从应用程序的消息队列中获得了一个消息时,系统就调用此函数,在将此 获得的消 息传送给相应窗口处理过程之前,系统将此消息传送给该挂钩处理过程 . 类型 HOOKPROCt义了指向此类回调函数的指针,GetMsgProc 是应用程序定义或库定义的相 应回调函数名的位置标识符 . 函数原形: LRESULT
25、CALLBACK GetMsgProc(i nt code,WPARAM wPara m,L PARAM lParam ); 参数: Code: 指示挂钩处理过程是否必须处理此消息.若 nCode 的值是 HC_ACTION 则挂钩处理过程必须处 理此消息,若 nCode 之值小于 0,此挂钩处理过程必须将此消息不加处理地传送给函数 CallNextHookEx 并返回其返回值. wParam: 指示此消息是否已从消息队列中被删除,此参数可以是以下值之一 PM_NOREMOVE:指出该消息尚未从消息队列中被删除(一个应用程序调用函数PeekMessage ,设置PM_NOREMOVE标志).
展开阅读全文