我的钩子不起作用
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 钩子不起作用