挂线程钩子,最主要的是调用SetWindowsHookEx函数,使用例下:
1 2 3 4 5 | g_hHook=SetWindowsHookEx( WH_SYSMSGFILTER|WH_MSGFILTER, //截获消息类型,可组合使用 (HOOKPROC)HookShowWindow, //消息回调函数 g_hInst, //消息回调函数所在模块的handle,因为是跨进程线程钩子,消息处理函数必须放到dll里面,故,这必须是dll的句柄。就因为这的错误,我折腾了几个小时。这个句柄可以在dllmain函数的hModule参数保存得到。 progID); //要挂钩子的线程ID |
其中, progID获取可如下:
DWORDprogID=GetWindowThreadProcessId(FindWindow("xvt320mditask100",NULL)->m_hWnd,NULL);
g_hInst获取如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | HINSTANCEg_hInst; BOOLAPIENTRYDllMain(HANDLEhModule, DWORD ul_reason_for_call, LPVOIDlpReserved ) { switch (ul_reason_for_call) { caseDLL_PROCESS_ATTACH: g_hInst= HINSTANCE (hModule); break ; caseDLL_PROCESS_DETACH: break ; caseDLL_THREAD_ATTACH: break ; caseDLL_THREAD_DETACH: break ; } return1; } |
g_hHook是挂钩子成功后返回的钩子句柄,须保存起来后面解钩使用。
UnhookWindowsHookEx(g_hHook);
就这么简单!
联系客服