我的挂钩不起作用

时间:2014-06-17 05:04:19

标签: c++ winapi hook

我在GUI应用程序中设置了一个钩子。我想用WH_CBT钩子捕获WM_DESTROY消息,但它似乎不起作用。

...

HWND ghWnd = NULL;
HHOOK ghHook = NULL;

...

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
    ...

    SetHook();

    ....
}


ATOM MyRegisterClass(HINSTANCE hInstance)
{
    ...
}

...

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    ...

    case WM_DESTROY:
        UnHook();
        PostQuitMessage(0);
        break;

    ...
}

LRESULT WINAPI HookProc(int Id, DWORD wParam, DWORD lParam)
{
    if ( Id == WM_DESTROY )
    {
            MessageBoxA(NULL, "I got it", NULL, 0);
    }

    return CallNextHookEx(ghHook, Id, wParam, lParam);
}

void SetHook()
{
    ghHook = SetWindowsHookEx(WH_CBT, (HOOKPROC)HookProc, hInst, GetCurrentThreadId());
    if ( ghHook != NULL )
        MessageBox(ghWnd, L"Hooked", L"Hook!", 0 );
    else
        MessageBox(ghWnd, L"Unable to hook", L"Hook!", 0 );
}

void UnHook()
{
    if ( ghHook != NULL )
    {
        UnhookWindowsHookEx(ghHook);
        MessageBoxA(ghWnd, "Unhooked", NULL, 0);
    }
}

当我运行应用程序时,我看到了消息" Hooked"和#34; UnHooked"当我点击X按钮(窗口右上角的X符号)时。

但是我错过了HookProc功能中的信息。

有人可以向我解释原因吗?

1 个答案:

答案 0 :(得分:1)

Read the documentationId挂钩回调中的WH_CBT 永远不会WM_DESTROY。当一个窗口即将被销毁时,Id将改为HCBT_DESTROYWND

如果您想捕获实际的WM_DESTROY消息,请使用WH_CALLWNDPROC挂钩。