SetWindowsHookEx和其回调函数的使用实例_论文-会议文章.pdf

上传人:c****2 文档编号:93971541 上传时间:2023-07-20 格式:PDF 页数:10 大小:534.90KB
返回 下载 相关 举报
SetWindowsHookEx和其回调函数的使用实例_论文-会议文章.pdf_第1页
第1页 / 共10页
SetWindowsHookEx和其回调函数的使用实例_论文-会议文章.pdf_第2页
第2页 / 共10页
点击查看更多>>
资源描述

《SetWindowsHookEx和其回调函数的使用实例_论文-会议文章.pdf》由会员分享,可在线阅读,更多相关《SetWindowsHookEx和其回调函数的使用实例_论文-会议文章.pdf(10页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、学习必备 欢迎下载 在网上找了好久都没有找到消息 hook 的实例,下面是我的例子给大家分享一下 下面是 dll 中的代码:/我的经验,编译的时候会提示 DllMain,已在 DllMain.cpp 中定义,把 DllMain.cpp 从源文件里删掉就好了#include stdafx.h#include HHOOK hkey=NULL;HINSTANCE h_dll;#pragma data_seg(.MySec)/定义字段,段名.MySec HWND h_wnd=NULL;#pragma data_seg()#pragma comment(linker,/section:.MySec,RW

2、S)BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved)h_dll=hinstDLL;/MessageBox(0,运行 dllman,MB_OK);return TRUE;LRESULT CALLBACK my_test(int nCode,WPARAM wParam,LPARAM iParam)/*if(nCode=HC_ACTION)MessageBox(0,成功!,标题,MB_OK);else MessageBox(0,失败!,标题,MB_OK);*/MessageBox(0,被截取,MB_O

3、K);UnhookWindowsHookEx(hkey);return 1;void SetHook(HWND hwnd)h_wnd=hwnd;/MessageBox(0,运行 sethook,MB_OK);hkey=SetWindowsHookEx(WH_KEYBOARD,my_test,h_dll,0);/下面是 EXE 的代码:有很多头文件是没用上的,我个人习惯都带着-,虽然这不是好习惯 学习必备 欢迎下载/#include stdafx.h#include#include#include#include#include#include#include#include#include#i

4、nclude#include#include#include#include#include#pragma comment(lib,PSAPI.LIB)#pragma comment(lib,shlwapi.lib)#pragma comment(lib,Kernel32.lib)using namespace std;typedef void(_cdecl*pfunc)(HWND);/定义函数指针类型 void main()HINSTANCE hmod;pfunc sethook;hmod=LoadLibrary(c:dll_hook.dll);/动态加载 dll if(hmod!=NULL

5、)sethook=(pfunc)GetProcAddress(hmod,SetHook);/调用 dll 中的函数 sethook(NULL);system(pause);/下面是我搜集的 hook 相关的文档,大多来自百度 验编译的时候会提示已在中定义把从源文件里删掉就好了定义字段段名运行成功标题失败标题被截取运行下面是的代码有很多头文件是没用上的我个人习惯都带着虽然这不是好习惯学习必备欢迎下载定义函数指针类型动态加载调用编甚至脚本语言等不过原理都是一样的这里就以来为例吧一般都是写在你要使用的地方在进一步解释之前先简略说明一下相关情况钩子有局部和远程两种类型与钩子相关的函数有建立钩子其四个参

6、数分别为钩子类型钩子函数地址钩函数名称任意三个参数具体意义与钩子类型有关这里以一个例子说明一下比如你想写一个程序当鼠标移到哪里时就在主程序中显示鼠标所在窗的名称如果鼠标只是局限在窗内那么以上三个函数均写在运行的主程序中比如函数可以写学习必备 欢迎下载 首先说一句,能够调用 WIN32API 的编程语言很多,例如汇编,Fortran,VB,C,Java,甚至脚本语言 matlab,ruby等,不过原理都是一样的,这里就以 C/C+来为例吧-SetWindowsHookEx一般都是写在你要使用 Hook 的地方,在进一步解释之前先简略说明一下Hook 相关情况-钩子有局部和远程两种类型,与钩子相关

7、的函数有:1.建立钩子:SetWindowsHookEx,其四个参数分别为钩子类型,钩子函数地址,钩子函数所在DLL 的实例句柄,安装钩子后想监控的线程的 ID 号,返回参数为钩子句柄 2.UnhookWindowsHookEx,参数只有一个,为要卸载的钩子句柄 3.钩子函数(名称任意),三个参数,具体意义与钩子类型有关 这里以一个例子说明一下:比如你想写一个程序,当鼠标移到哪里时就在主程序中显示鼠标所在窗口的名称-(1)如果鼠标只是局限在窗口内,那么以上 1,2,3 三个函数均写在运行的主程序中,比如函数 1可以写在按下某个按钮的消息响应函数中,函数 2 写在松开按扭的消息响应函数中,函数

8、3 只要不写在别的函数中就行,因为它本生就是一个要定义的独立函数 (2)如果鼠标可以在屏幕任意位置移动,那么以上函数 1,2 位置同(1),但函数 3 要写在一个另外写的 DLL 里,因为此时安装的是全局钩子,为了达到获取窗口名称的目的,在 DLL 里可能还要做一些其他工作,比如设置共享段,关于这些这里不细说了 -关于钩子,以上只是简单说了一下,不过,使用钩子确实也很简单,因为主要的工作还是在钩子函数里-关于钩子的使用其实真的很简单,应该说 WIN32 编程 其实真的很简单,更进一步说,不用动脑筋写算法只用熟练语法的编程 都很简单,这里当然也包括钩子的应用啦 :)说到这里忍不住发表一点题外话,

9、编程多年,走过很多弯路,体会很多,关于编程,其实学问很大,小到学语法,大到算法,应用,架构等等,作为一门计算机科学,与物理,数学等有关系的分枝还有很多,还有与电子相关的专业等,内容庞杂 验编译的时候会提示已在中定义把从源文件里删掉就好了定义字段段名运行成功标题失败标题被截取运行下面是的代码有很多头文件是没用上的我个人习惯都带着虽然这不是好习惯学习必备欢迎下载定义函数指针类型动态加载调用编甚至脚本语言等不过原理都是一样的这里就以来为例吧一般都是写在你要使用的地方在进一步解释之前先简略说明一下相关情况钩子有局部和远程两种类型与钩子相关的函数有建立钩子其四个参数分别为钩子类型钩子函数地址钩函数名称任

10、意三个参数具体意义与钩子类型有关这里以一个例子说明一下比如你想写一个程序当鼠标移到哪里时就在主程序中显示鼠标所在窗的名称如果鼠标只是局限在窗内那么以上三个函数均写在运行的主程序中比如函数可以写学习必备 欢迎下载 因此,如果你真想学点东西,不要局限在写一个有特殊用途的桌面程序,也不要整天沉浸在各种语言,语法中,最主要的是不要贪多!明确自己学编程到底想做什么,是写软件,开发游戏,还是搞网络,还是做算法,还是解决理工,数学,电子问题 打好基础,明确目标,就好好钻研吧,不要什么都学,但什么都不精 扯远了,说不定你本生就已经很厉害了,我反倒显得有些班门弄斧了,不过都是真实体会,不管对你有没有用,再一次

11、Good luck!编辑本段 语法 HHOOK WINAPI SetWindowsHookEx(_in int idHook,_in HOOKPROC lpfn,_in HINSTANCE hMod,_in DWORD dwThreadId);编辑本段 基本概念 钩子(Hook),是 Windows 消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达后,在目标窗口处理函数之前处理它。钩子机制允许应用程序截获处理 window 消息或特定事件。钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发

12、出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。-编辑本段 运行机制 1、钩子链表和钩子子程:每一个 Hook 都有一个与之相关联的指针列表,称之为钩子链表,由系统来维护。这个列表的指针指向指定的,应用程 序定义的,被 Hook 子程调用的回调函数,也就是验编译的时候会提示已在中定义把从源文件里删掉就好了定义字段段名运行成功标题失败标题被截取运行下面是的代码有很多头文件是没用上的我个人习惯都带着虽然这不是好习惯学习必备欢迎下载定义函数指针类型动态加载调用编甚至脚本语言

13、等不过原理都是一样的这里就以来为例吧一般都是写在你要使用的地方在进一步解释之前先简略说明一下相关情况钩子有局部和远程两种类型与钩子相关的函数有建立钩子其四个参数分别为钩子类型钩子函数地址钩函数名称任意三个参数具体意义与钩子类型有关这里以一个例子说明一下比如你想写一个程序当鼠标移到哪里时就在主程序中显示鼠标所在窗的名称如果鼠标只是局限在窗内那么以上三个函数均写在运行的主程序中比如函数可以写学习必备 欢迎下载 该钩子的各个处理子程。当与指定的 Hook 类型关联的消息发生时,系统就把这个消息传递到 Hook 子程。一些 Hook 子程可以只监视消息,或者修改消息,或者停止消息的前进,避免这些消息传

14、递到下一个 Hook 子程或者目的窗口。最近安装的钩子放在链的开始,而最早安装的钩子放在最后,也就是后加入的先获得控制权。Windows 并不要求钩子子程的卸载顺序一定得和安装顺序相反。每当有一个钩子被卸载,Windows 便释放其占用的内存,并更新整个 Hook 链表。如果程序安装了钩子,但是在尚未卸载钩子之前就结束了,那么系统会自动为它做卸载钩子的操作。钩子子程是一个应用程序定义的回调函数(CALLBACK Function),不能定义成某个类的成员函数,只能定义为普通的 C 函数。用以监视系统或某一特定类型的事件,这些事件可以是与某一特定线程关联的,也可以是系统中所有线程的事件。编辑本段

15、 钩子回调函数必须按照以下的语法 LRESULT CALLBACK HookProc (int nCode,WPARAM wParam,LPARAM lParam );HookProc是回调函数名。nCode 参数是 Hook 代码,Hook 子程使用这个参数来确定任务。这个参数的值依赖于 Hook 类型,每一种 Hook 都有自己的 Hook 代码特征字符集。wParam和 lParam 参数的值依赖于 Hook 代码,但是它们的典型值是包含了关于发送或者接收消息的信息。2、钩子的安装与释放:使用 API 函数 SetWindowsHookEx()把一个应用程序定义的钩子子程安装到钩子链表中

16、。SetWindowsHookEx函数总是在 Hook 链的开头安装 Hook 子程。当指定类型的Hook 监视的事件发生时,系统就调用与这个 Hook 关联的 Hook 链的开头的 Hook 子程。每一个 Hook 链中的 Hook 子程都决定是否把这个事件传递到下一个 Hook 子程。Hook子程传递事件到下一个 Hook 子程需要调用 CallNextHookEx函数。HHOOK SetWindowsHookEx(int idHook,/钩子的类型,即它处理的消息类型 HOOKPROC lpfn,/钩子子程的地址指针。如果 dwThreadId参数为 0 /或是一个由别的进程创建的线程的

17、标识,/lpfn 必须指向 DLL 中的钩子子程。/除此以外,lpfn 可以指向当前进程的一段钩子子程代码。验编译的时候会提示已在中定义把从源文件里删掉就好了定义字段段名运行成功标题失败标题被截取运行下面是的代码有很多头文件是没用上的我个人习惯都带着虽然这不是好习惯学习必备欢迎下载定义函数指针类型动态加载调用编甚至脚本语言等不过原理都是一样的这里就以来为例吧一般都是写在你要使用的地方在进一步解释之前先简略说明一下相关情况钩子有局部和远程两种类型与钩子相关的函数有建立钩子其四个参数分别为钩子类型钩子函数地址钩函数名称任意三个参数具体意义与钩子类型有关这里以一个例子说明一下比如你想写一个程序当鼠标

18、移到哪里时就在主程序中显示鼠标所在窗的名称如果鼠标只是局限在窗内那么以上三个函数均写在运行的主程序中比如函数可以写学习必备 欢迎下载 /钩子函数的入口地址,当钩子钩到任何消息后便调用这个函数。HINSTANCE hMod,/应用程序实例的句柄。标识包含 lpfn 所指的子程的 DLL。/如果 dwThreadId 标识当前进程创建的一个线程,/而且子程代码位于当前进程,hMod 必须为 NULL。/可以很简单的设定其为本应用程序的实例句柄。DWORD dwThreadId/与安装的钩子子程相关联的线程的标识符。/如果为 0,钩子子程与所有的线程关联,即为全局钩子。);函数成功则返回钩子子程的句

19、柄,失败返回 NULL。以上所说的钩子子程与线程相关联是指在一钩子链表中发给该线程的消息同时发送给钩子子程,且被钩子子程先处理。在钩子子程中调用得到控制权的钩子函数在完成对消息的处理后,如果想要该消息继续传递,那么它必须调用另外一个 SDK 中的 API 函数 CallNextHookEx来传递它,以执行钩子链表所指的下一个钩子子程。这个函数成功时返回钩子链中下一个钩子过程的返回值,返回值的类型依赖于钩子的类型。这个函数的原型如下:LRESULT CallNextHookEx (HHOOK hhk;int nCode;WPARAM wParam;LPARAM lParam;);hhk 为当前钩

20、子的句柄,由 SetWindowsHookEx()函数返回。NCode 为传给钩子过程的事件代码。wParam和 lParam 分别是传给钩子子程的 wParam值,其具体含义与钩子类型有关。钩子函数也可以通过直接返回 TRUE 来丢弃该消息,并阻止该消息的传递。否则的话,其他安装了钩子的应用程序将不会接收到钩子的通知而且还有可能产生不正确的结果。钩子在使用完之后需要用 UnHookWindowsHookEx()卸载,否则会造成麻烦。释放钩子比较简单,UnHookWindowsHookEx()只有一个参数。函数原型如下:UnHookWindowsHookEx (HHOOK hhk;);验编译的

21、时候会提示已在中定义把从源文件里删掉就好了定义字段段名运行成功标题失败标题被截取运行下面是的代码有很多头文件是没用上的我个人习惯都带着虽然这不是好习惯学习必备欢迎下载定义函数指针类型动态加载调用编甚至脚本语言等不过原理都是一样的这里就以来为例吧一般都是写在你要使用的地方在进一步解释之前先简略说明一下相关情况钩子有局部和远程两种类型与钩子相关的函数有建立钩子其四个参数分别为钩子类型钩子函数地址钩函数名称任意三个参数具体意义与钩子类型有关这里以一个例子说明一下比如你想写一个程序当鼠标移到哪里时就在主程序中显示鼠标所在窗的名称如果鼠标只是局限在窗内那么以上三个函数均写在运行的主程序中比如函数可以写学

22、习必备 欢迎下载 函数成功返回 TRUE,否则返回 FALSE。3、一些运行机制:在 Win16 环境中,DLL 的全局数据对每个载入它的进程来说都是相同的;而在 Win32 环境中,情况却发生了变化,DLL 函数中的代码所创建的任何对象(包括变量)都归调用它的线程或进程所有。当进程在载入 DLL 时,操作系统自动把 DLL 地址映射到该进程的私有空间,也就是进程的虚拟地址空间,而且也复制该 DLL 的全局数据的一份拷贝到该进程空间。也就是说每个进程所拥有的相同的 DLL 的全局数据,它们的名称相同,但其值却并不一定是相同的,而且是互不干涉的。因此,在 Win32 环境下要想在多个进程中共享数

23、据,就必须进行必要的设置。在访问同一个 Dll 的各进程 之间共享存储器是通过存储器映射文件技术实现的。也可以把这些需要共享的数据分离出来,放置在一个独立的数据段里,并把该段的属性设置为共享。必须给这些 变量赋初值,否则编译器会把没有赋初始值的变量放在一个叫未被初始化的数据段中。#pragma data_seg预处理指令用于设置共享数据段。例如:#pragma data_seg(SharedDataName)HHOOK hHook=NULL;#pragma data_seg()在#pragma data_seg(SharedDataName)和#pragma data_seg()之间的所有变量

24、将被访问该 Dll 的所有进程看到和共享。再加上一条指令#pragma comment(linker,/section:.SharedDataName,rws),那么这个数据节中的数据可以在所有 DLL 的实例之间共 享。所有对这些数据的操作都针对同一个实例的,而不是在每个进程的地址空间中都有一份。当进程隐式或显式调用一个动态库里的函数时,系统都要把这个动态库映射到这个进程的虚拟地址空间里(以下简称地址空间)。这使得 DLL 成为进程的一部分,以这个进程的身份执行,使用这个进程的堆栈。4、系统钩子与线程钩子:SetWindowsHookEx()函数的最后一个参数决定了此钩子是系统钩子还是线程钩

25、子。线程勾子用于监视指定线程的事件消息。线程勾子一般在当前线程或者当前线程派生的线程内。系统勾子监视系统中的所有线程的事件消息。因为系统勾子会影响系统中所有的应用程序,所以勾子函数必须放在独立的动态链接库(DLL)中。系统自动将包含钩子回调函数的 DLL 映射到受钩子函数影响的所有进程的地址空间中,即将这个 DLL 注入了那些进程。编辑本段 验编译的时候会提示已在中定义把从源文件里删掉就好了定义字段段名运行成功标题失败标题被截取运行下面是的代码有很多头文件是没用上的我个人习惯都带着虽然这不是好习惯学习必备欢迎下载定义函数指针类型动态加载调用编甚至脚本语言等不过原理都是一样的这里就以来为例吧一般

26、都是写在你要使用的地方在进一步解释之前先简略说明一下相关情况钩子有局部和远程两种类型与钩子相关的函数有建立钩子其四个参数分别为钩子类型钩子函数地址钩函数名称任意三个参数具体意义与钩子类型有关这里以一个例子说明一下比如你想写一个程序当鼠标移到哪里时就在主程序中显示鼠标所在窗的名称如果鼠标只是局限在窗内那么以上三个函数均写在运行的主程序中比如函数可以写学习必备 欢迎下载 几点说明 (1)如果对于同一事件(如鼠标消息)既安装了线程勾子又安装了系统勾子,那么系统会自动先调用线程勾子,然后调用系统勾子。(2)对同一事件消息可安装多个勾子处理过程,这些勾子处理过程形成了勾子链。当前勾子处理结束后应把勾子信

27、息传递给下一个勾子函数。(3)勾子特别是系统勾子会消耗消息处理时间,降低系统性能。只有在必要的时候才安装勾子,在使用完毕后要及时卸载。-编辑本段 钩子类型 每一种类型的 Hook 可以使应用程序能够监视不同类型的系统消息处理机制。下面描述所有可以利用的 Hook 类型。1、WH_CALLWNDPROC和 WH_CALLWNDPROCRET Hooks WH_CALLWNDPROC和 WH_CALLWNDPROCRET Hooks 使你可以监视发送到窗口过程的消息。系统在消息发送到接收窗口过程之前调用 WH_CALLWNDPROC Hook 子程,并且在窗口过程处理完消息之后调用 WH_CALL

28、WNDPROCRET Hook 子程。WH_CALLWNDPROCRET Hook 传递指针到 CWPRETSTRUCT结构,再传递到 Hook 子程。CWPRETSTRUCT结构包含了来自处理消息的窗口过程的返回值,同样也包括了与这个消息关联的消息参数。2、WH_CBT Hook 在以下事件之前,系统都会调用 WH_CBT Hook 子程,这些事件包括:1)激活,建立,销毁,最小化,最大化,移动,改变尺寸等窗口事件;2)完成系统指令;3)来自系统消息队列中的移动鼠标,键盘事件;4)设置输入焦点事件;5)同步系统消息队列事件。Hook 子程的返回值确定系统是否允许或者防止这些操作中的一个。3、

29、WH_DEBUG Hook 在系统调用系统中与其他 Hook 关联的 Hook 子程之前,系统会调用 WH_DEBUG Hook 子程。你可以使用这个 Hook 来决定是否允许系统调用与其他 Hook 关联的 Hook子程。4、WH_FOREGROUNDIDLE Hook 验编译的时候会提示已在中定义把从源文件里删掉就好了定义字段段名运行成功标题失败标题被截取运行下面是的代码有很多头文件是没用上的我个人习惯都带着虽然这不是好习惯学习必备欢迎下载定义函数指针类型动态加载调用编甚至脚本语言等不过原理都是一样的这里就以来为例吧一般都是写在你要使用的地方在进一步解释之前先简略说明一下相关情况钩子有局部

30、和远程两种类型与钩子相关的函数有建立钩子其四个参数分别为钩子类型钩子函数地址钩函数名称任意三个参数具体意义与钩子类型有关这里以一个例子说明一下比如你想写一个程序当鼠标移到哪里时就在主程序中显示鼠标所在窗的名称如果鼠标只是局限在窗内那么以上三个函数均写在运行的主程序中比如函数可以写学习必备 欢迎下载 当应用程序的前台线程处于空闲状态时,可以使用 WH_FOREGROUNDIDLE Hook 执行低优先级的任务。当应用程序的前台线程大概要变成空闲状态时,系统就会调用WH_FOREGROUNDIDLE Hook 子程。5、WH_GETMESSAGE Hook 应用程序使用 WH_GETMESSAGE

31、 Hook 来监视从 GetMessage or PeekMessage函数返回的消息。你可以使用 WH_GETMESSAGE Hook 去监视鼠标和键盘输入,以及其他发送到消息队列中的消息。6、WH_JOURNALPLAYBACK Hook WH_JOURNALPLAYBACK Hook 使应用程序可以插入消息到系统消息队列。可以使用这个 Hook 回放通过使用 WH_JOURNALRECORD Hook 记录下来的连续的鼠标和键盘事件。只要 WH_JOURNALPLAYBACK Hook 已经安装,正常的鼠标和键盘事件就是无效的。WH_JOURNALPLAYBACK Hook 是全局 Ho

32、ok,它不能象线程特定 Hook 一样使用。WH_JOURNALPLAYBACK Hook 返回超时值,这个值告诉系统在处理来自回放 Hook 当前消息之前需要等待多长时间(毫秒)。这就使 Hook 可以控制实时事件的回放。WH_JOURNALPLAYBACK是 system-wide local hooks,它们不会被注射到任何行程位址空间。7、WH_JOURNALRECORD Hook WH_JOURNALRECORD Hook 用来监视和记录输入事件。典型的,可以使用这个Hook 记录连续的鼠标和键盘事件,然后通过使用 WH_JOURNALPLAYBACK Hook 来回放。WH_JOU

33、RNALRECORD Hook 是全局 Hook,它不能象线程特定 Hook 一样使用。WH_JOURNALRECORD是 system-wide local hooks,它们不会被注射到任何行程位址空间。8、WH_KEYBOARD Hook 在应用程序中,WH_KEYBOARD Hook 用来监视 WM_KEYDOWN and WM_KEYUP 消息,这些消息通过 GetMessage or PeekMessage function 返回。可以使用这个Hook 来监视输入到消息队列中的键盘消息。9、WH_KEYBOARD_LL Hook WH_KEYBOARD_LL Hook 监视输入到线程

34、消息队列中的键盘消息。10、WH_MOUSE Hook WH_MOUSE Hook 监视从 GetMessage 或者 PeekMessage 函数返回的鼠标消息。使用这个 Hook 监视输入到消息队列中的鼠标消息。11、WH_MOUSE_LL Hook 验编译的时候会提示已在中定义把从源文件里删掉就好了定义字段段名运行成功标题失败标题被截取运行下面是的代码有很多头文件是没用上的我个人习惯都带着虽然这不是好习惯学习必备欢迎下载定义函数指针类型动态加载调用编甚至脚本语言等不过原理都是一样的这里就以来为例吧一般都是写在你要使用的地方在进一步解释之前先简略说明一下相关情况钩子有局部和远程两种类型与钩

35、子相关的函数有建立钩子其四个参数分别为钩子类型钩子函数地址钩函数名称任意三个参数具体意义与钩子类型有关这里以一个例子说明一下比如你想写一个程序当鼠标移到哪里时就在主程序中显示鼠标所在窗的名称如果鼠标只是局限在窗内那么以上三个函数均写在运行的主程序中比如函数可以写学习必备 欢迎下载 WH_MOUSE_LL Hook 监视输入到线程消息队列中的鼠标消息。12、WH_MSGFILTER 和 WH_SYSMSGFILTER Hooks WH_MSGFILTER 和 WH_SYSMSGFILTER Hooks 使我们可以监视菜单,滚动条,消息框,对话框消息并且发现用户使用 ALT+TAB or ALT+

36、ESC 组合键切换窗口。WH_MSGFILTER Hook 只能监视传递到菜单,滚动条,消息框的消息,以及传递到通过安装了 Hook 子程的应用程序建立的对话框的消息。WH_SYSMSGFILTER Hook 监视所有应用程序消息。WH_MSGFILTER 和 WH_SYSMSGFILTER Hooks 使我们可以在模式循环期间过滤消息,这等价于在主消息循环中过滤消息。通过调用 CallMsgFilter function 可以直接的调用 WH_MSGFILTER Hook。通过使用这个函数,应用程序能够在模式循环期间使用相同的代码去过滤消息,如同在主消息循环里一样。13、WH_SHELL H

37、ook 外壳应用程序可以使用 WH_SHELL Hook 去接收重要的通知。当外壳应用程序是激活的并且当顶层窗口建立或者销毁时,系统调用 WH_SHELL Hook 子程。WH_SHELL 共有钟情况:1)只要有个 top-level、unowned 窗口被产生、起作用、或是被摧毁;2)当 Taskbar 需要重画某个按钮;3)当系统需要显示关于 Taskbar 的一个程序的最小化形式;4)当目前的键盘布局状态改变;5)当使用者按 Ctrl+Esc 去执行 Task Manager(或相同级别的程序)。按照惯例,外壳应用程序都不接收 WH_SHELL消息。所以,在应用程序能够接收WH_SHEL

38、L 消息之前,应用程序必须调用 SystemParametersInfo function注册它自己。验编译的时候会提示已在中定义把从源文件里删掉就好了定义字段段名运行成功标题失败标题被截取运行下面是的代码有很多头文件是没用上的我个人习惯都带着虽然这不是好习惯学习必备欢迎下载定义函数指针类型动态加载调用编甚至脚本语言等不过原理都是一样的这里就以来为例吧一般都是写在你要使用的地方在进一步解释之前先简略说明一下相关情况钩子有局部和远程两种类型与钩子相关的函数有建立钩子其四个参数分别为钩子类型钩子函数地址钩函数名称任意三个参数具体意义与钩子类型有关这里以一个例子说明一下比如你想写一个程序当鼠标移到哪里时就在主程序中显示鼠标所在窗的名称如果鼠标只是局限在窗内那么以上三个函数均写在运行的主程序中比如函数可以写

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁