我使用SetWindowsHookEx函数实现一个DLL来记录用户的输入。
此外,我在钩子程序运行后注入我的DLL。
SetWindowsHookEx的返回值表明它们都成功挂钩了进程。
但是,我不知道为什么当我在DLL_THREAD_ATTACH中设置我的钩子时,消息钩子工作正常。但是当线程死亡时钩子将被断开,这对我记录用户的输入非常烦人。
当我在DLL_PROCESS_ATTACH中设置我的钩子时,它会进入那种情况,但似乎我的钩子永远不会收到HOOKPROC的回调。
因此,我只发布了DllMain和SetMyHook函数。
我的代码结构:
BOOL APIENTRY DllMain( HINSTANCE hInst, DWORD ul_reason_for_call, LPVOID lpReserved )
{
switch( ul_reason_for_call )
{
case DLL_PROCESS_ATTACH:
MainHwnd = GetMainWindow();
SetMyHook(hWnd_tid, hInst);
break;
case DLL_PROCESS_DETACH:
ClearMyHook();
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
}
return TRUE;
}
__declspec(dllexport) BOOL WINAPI SetMyHook(DWORD tid, HMODULE hInstance)
{
Hook = SetWindowsHookEx(WH_CALLWNDPROC, (HOOKPROC)MsgHook, hInstance, tid);
MHook = SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC)MenuHook, hInstance, tid);
if(Hook && MHook)
return TRUE;
else
return FALSE;
}
__declspec(dllexport) BOOL ClearMyHook(void)
{
if (UnhookWindowsHookEx(Hook) && UnhookWindowsHookEx(MHook))
{
return TRUE;
}
return FALSE;
}
注意:
如果我将DLL_PROCESS_ATTACH中的代码移动到DLL_THREAD_ATTACH,它将工作!!
我不知道为什么会发生......