SetWindowsHookEx和其回调函数的使用实例_论文-会议文章.pdf
《SetWindowsHookEx和其回调函数的使用实例_论文-会议文章.pdf》由会员分享,可在线阅读,更多相关《SetWindowsHookEx和其回调函数的使用实例_论文-会议文章.pdf(10页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
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 为当前钩
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SetWindowsHookEx 调函 使用 实例 论文 会议 文章
限制150内