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