掛線程鉤子,最主要的是調用SetWindowsHookEx函數,使用例下:
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獲取如下:
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);
就這麼簡單!