Hook小笔记
来源:互联网 发布:杭州整站优化公司 编辑:程序博客网 时间:2024/06/15 23:28
Hook是在应用程序和操作系统之间传递消息时候截取消息给我们自己写的钩子子程来处理,而我们的钩子子程可以阻止消息的传递,也可以改变消息,也可以直接放行。取决于LRESULT CALLBACK XXX(int nCode,WPARAM wParam,LPARAM,lParam)这个钩子子程中的处理内容。
SetWindowsHookEx(int idHook,HOOKPROC lpfn, HINSTANCE hMod, DWORD dwThreadId)
第一个参数idHook是要hook的消息种类(如WH_MOUSE,WH_KEYBOARD。。在MSDN可以查询)
第二个参数lpfn是hook子程的名称(LRESULT CALLBACK XXX)XXX
第三四个参数是Hook的作用域:
钩子分为全局钩子和局部钩子:(取决于SetWindowsHookEx的第三四个参数内容)
全局钩子,当第四个参数内容为NULL时候,第三个钩子为有钩子程序的DLL的实例句柄(可以通过GetModuleHandle(LPCTSTR lpModuleName)来获取,也可以通过在DLL中加入一个DllMain()来使每次加载dll都运行这个DllMain从而获取这个DllMain的第一个参数即为DLL实例句柄)
Hook子程:LRESULT CALLBACK XXX(int nCode,WPARAM wParam,LPARAM,lParam)
这个XXX名字可以随意取,只要SetWindowsHookEx()中和对应的WH_XXX对应就可以
第一个参数一般为消息状态(是否在消息队列中,一般为HC_ACTION),这个值一般>=0,小于0就必须用CallNextHookEx()来传递给钩链中的下一个钩子子程或者传回应用程序。
第二个参数wParam:如处理WH_KEYBOARD就表示虚拟按键
第三个参数lParam: 如处理WH_KEYBOARD就表示按键的状态(在MSDN都可以查询)
返回不为0表示处理了消息,而如果不处理消息或者传递给下一个钩链则return CallNextHookEx()
钩链:
针对同一个消息的不同处理子程的链式结构,类似于栈,先Set的子程在钩链的最后位置,有最高的控制权,当然也可以在中途就返回非0就可以不进行后面的钩子子程。
Dll的写法,
#include<windwos.h>HINSTANCE g_hInstance = NULL;HHOOK g_hook = NULL;BOOL WINAPI DllMain(HANDLE hinstDLL, DWORD dwReason, LPVOID lpvReserved){ g_hInstance = hinstDll; return TRUE;}LRESULT CALLBACK XXX(int nCode,WPARAM wParam,LPARAM,lParam){ //处理的代码 return 1;//return CallNextHookEx()}#ifdef __cplusplusextern "C"{#endif__declspec(dllexport)void SetHook(){g_hook = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, g_hInstance, 0);//全局钩子 //局部钩子 g_hook = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, 0, GetModuleHandle(dll名字));}#ifdef __cplusplus}#endif
- Hook小笔记
- Hook学习笔记
- 串讲笔记:Hook
- Hook学习笔记
- Hook学习笔记
- Hook学习笔记
- 笔记(Hook API) 收藏
- 笔记SSDT HOOK
- C++ Hook学习笔记
- HOOK WSARecv 笔记
- 笔记(Hook API)
- Hook :学习笔记
- Hook学习笔记
- Hook技术笔记
- 抛砖引玉 - hook的小例子
- Windows Hook的小研究
- Hook的两个小插曲
- 我的Hook学习笔记
- hdoj 1004 Let the Balloon Rise
- HDU
- jquery操作数组
- 论文类型Journal、magazin、transaction、letter等的区别
- oracle中的约束操作
- Hook小笔记
- 设计模式 _备忘录模式
- JAVA设计模式之单例模式
- 算法题练习系列之(二十一): 人口普查
- 将输入的数以任意进制(16进制以内)输出
- 1.20.ARM汇编指令集8之存储器访问指令(LDM和STM & SWP)
- bootstrap系列之三列表与代码样式
- [LintCode]38.搜索二维矩阵 II
- 使用Spring Boot搭建个人博客全记录