前段时间学习了HOOK,但没有做笔记,今天稍微整理下。 HHOOK WINAPI SetWindowsHookEx(int idHook,HOOKPROC lpfn, HINSTANCE hmod, DWORD dwThreadId);
WINAPI不用说 大家知道是__stdcall,windows api的标准调用方式,由api函数中自行清理堆栈。 typedef LRESULT (CALLBACK *)(int nCode, WPARAM wParam, LPARAM lParam) HOOKPROC;
参数3 在进程内钩子时为NULL,在系统钩子时指定钩子过程所在的DLL,是HINSTANCE类型的,可以通过GetModule来获取。 参数4 在进程内钩子时是GetCurrentThreadId(),在系统钩子时设0。 返回值:钩子的句柄,可根据该句柄卸载钩子。
LRESULT WINAPI CallNextHookEx(HHOOK hhk,int nCode, WPARAM wParam, LPARAM lParam);
在HookProc中判断该消息是否是自己要处理的,如果是的话处理完返回一个1,则不会调用别人设置的钩子了,否则要调用下一个钩子。 BOOL WINAPI UnhookWindowsHookEx(HHOOK hhk);
卸载掉一个钩子。 四 设置系统钩子的方法 系统钩子的设置需要将钩子过程函数放到动态链接库中,原因很简单,因为动态链接库在内存中是共享的,所以系统才能访问到这个钩子过程函数。 在原钩子过程的基础上加入 __declspec(dllexport) 即可实现,然后其他进程导入该钩子过程函数,调用SetWindowHookEx的时候第三个参数设置GetModule获取的dll模块,第四个参数设置0即可。 |
|
来自: 空城66 > 《Windows的HOOK机制》