SetWindowHookEx()返回NULL

时间:2015-12-25 09:05:13

标签: windows winapi null set hook

我正在尝试创建一个应用程序,该应用程序将通知Windows中每个活动窗口更改,以便它可以执行一些任务,例如检测窗口标题,因此"惩罚"坏人在我们的PC机上访问不良内容。因此,这对于应用程序非常重要,因为它的目的是记录"坏"历史应用。

所以,在我的main函数中,我为WindowLogger启动了一个帖子。

windowThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) WindowLogger,
        (LPVOID) argv[0], 0, NULL );

if (windowThread)
{
    // Also a bit of protection here.. 
    return WaitForSingleObject(windowThread, INFINITE);
}

然后,这是我的WindowLogger程序:

// Function called by main function to install hook
DWORD WINAPI
WindowLogger(LPVOID lpParameter)
{

    HHOOK hWinHook;

    HINSTANCE hExe = GetModuleHandle(NULL);

    if (!hExe)
    {
        return 1;
    }
    else
    {
        hWinHook = SetWindowsHookEx(WH_CBT, (HOOKPROC) CBTProc, hExe, 0);

        MSG msg;

        // I AM UNSURE ABOUT THIS PART.. 
        // Probably wrong code :D .. 

       while (GetMessage(&msg, NULL, 0, 0) != 0)
        {
             if (msg.message == HCBT_ACTIVATE) {
                // my code to log the window name
            }
        }
        UnhookWindowsHookEx(hWinHook);
    }
    return 0;
}

最后,我的CBTProc回调函数,它使用我的log()函数记录窗口:

LRESULT CALLBACK
CBTProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    switch (nCode)
    {

    case HCBT_ACTIVATE:
    {
        HWND foreground = GetForegroundWindow();
        char window_title[50];
        if (foreground)
            GetWindowText(foreground, window_title, 25);

            log("|");
            log(&window_title[0]);
            log("|");  

        }
    }
}

所以我调试了程序,我发现hWinHookNULL之后成为SetWindowsHookEx() - 这可能导致我的程序邮件功能... 你能帮我解决这个问题吗?

提前致谢。

1 个答案:

答案 0 :(得分:2)

0参数dwThreadId传递给SetWindowsHookEx用于为系统中的所有线程注册挂钩,即全局挂钩。但是,要执行此操作,您的钩子代码需要位于DLL中(以便DLL可以映射到其他进程的地址空间)。由于您的钩子代码在主要的可执行文件而不是DLL中,因此调用失败。