我的钩子不起作用

My hooking doesn't work

本文关键字:不起作用 我的      更新时间:2023-10-16

我在我的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);
    }
}

当我运行应用程序时,当我点击X按钮(窗口右上角的X符号)时,我看到消息"钩上"answers"未钩上"。

但是我错过了HookProc函数中的消息。

谁能给我解释一下为什么?

阅读文档。WH_CBT钩子回调中的Id 永远不会WM_DESTROY。当一个窗口即将被破坏时,Id将改为HCBT_DESTROYWND

如果想捕获实际的WM_DESTROY消息,请使用WH_CALLWNDPROC钩子代替。