Windows Hook的DLL入口点

时间:2015-08-14 07:58:16

标签: winapi dll hook


我使用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,它将工作!!
我不知道为什么会发生......

0 个答案:

没有答案