我使用SetWindowsHookEx函数实现一个DLL来记录用户的输入 .
此外,我在钩子程序运行后注入我的DLL .
SetWindowsHookEx的返回值表明它们都成功挂钩了进程 .
但是,我没有输入't know why when I set my hook in DLL_THREAD_ATTACH , the message hook works good. But the hook will be disconnected when the thread dies, which is very annoying for me to log user' .
当我在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,它将工作!!
我不知道为什么会发生......