我的钩子不起作用

Posted

技术标签:

【中文标题】我的钩子不起作用【英文标题】:My hooking doesn't work 【发布时间】:2014-06-17 05:04:19 【问题描述】:

我在我的 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 符号)时,我会看到消息“Hooked”和“UnHooked”。

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

谁能解释一下为什么?

【问题讨论】:

我看错了这个问题.....(正在伸手去拿垃圾邮件按钮......):) CBT 挂钩要求回调位于 DLL 中。使用可访问性挂钩。 CBT 可以是全局钩子,也可以是局部钩子。在我的例子中,它是一个本地钩子,所以我们不需要将它们放入 DLL 中。 【参考方案1】:

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

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

【讨论】:

当我编辑到 (Id == HCBT_DESTROYWND) 时,窗口显示后我被困在“我知道了”消息中。表示我什么都做不了,出现消息框,我点击确定,再次出现消息框,我点击确定,以此类推。 当然,因为MessageBox() 显示的弹出对话框像任何其他 UI 一样使用 HWND。当您关闭对话框时,这些 HWND 将被销毁,从而触发 HCBT_DESTROYWND 通知。所以不要在你的钩子中调用MessageBox(),使用另一种调试方法,比如OutputDebugString() 我添加了一个 HWND 条件并且它有效。感谢您的信息。

以上是关于我的钩子不起作用的主要内容,如果未能解决你的问题,请参考以下文章

将其添加到 package.json 后,husky 预提交钩子不起作用

反应:通过状态钩子在 loginHandler 函数中向 localStorage 添加令牌不起作用

Firebase auth 和 React Hook - 从钩子返回函数不起作用

尽管控制台没有显示错误,但 useHistory 钩子不起作用

为啥 DirectX Device Present 钩子在弯路中不起作用?

使用 jest 模拟 react-router-dom 钩子不起作用