gpt4 book ai didi

c - Hook 窗口消息循环 WM_CLOSE

转载 作者:行者123 更新时间:2023-11-30 14:22:15 25 4
gpt4 key购买 nike

我想“保护”某个窗口不被关闭。所以我想 Hook WM_CLOSE、WM_DESTOY 或 WM_QUIT。这就是我尝试这样做的:

LRESULT CALLBACK WindowHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode >= 0)
{
MSG* msg = (MSG*)lParam;
//if (msg->hwnd == GetForegroundWindow())
{
if (msg->message == WM_CLOSE || msg->message == WM_QUIT || msg->message == WM_DESTROY)
{
//MessageBox(0, "TEST", "", 0);
msg->message = 0;
CallNextHookEx(hMsg, nCode, (WPARAM)NULL, (LPARAM)NULL);
return TRUE;
}
}
}

CallNextHookEx(hMsg, nCode, wParam, lParam);
}

我尝试过:

  • 返回 TRUE 或 FALSE
  • 使用 NULL 作为 LPARAM 调用 CallNextHookEx 或将 msg->message 编辑为 0

我还注意到,如果我 Hook WH_GETMESSAGE 它不会“阻止”消息循环。但它是通过 Hook WH_CALLWNDPROC 来实现的。当 msg->message 等于 WM_CLOSE 时,我通过提示消息框发现了这一点。

提前致谢,问候。

最佳答案

WH_GETMESSAGE 为从消息队列检索的消息安装一个 Hook 。它确实允许您修改消息。但问题是WM_CLOSE不是用PostMessage()发布到消息队列的,而是用SendMessage()发送的。这个钩子(Hook)看不到它。

WH_CALLWNDPROC 安装一个在调用窗口过程之前运行的 Hook 。这将允许您看到 WM_CLOSE。但是,您不得修改该消息或使其消失。

没有任何钩子(Hook)可以让你做你想做的事。相反,您必须对窗口过程进行子类化。这样您自己的自定义窗口过程就会在窗口自己的过程之前被调用。现在您可以通过不调用旧的窗口过程来简单地过滤 WM_CLOSE。

请注意,您仍然需要 SetWindowsHookEx() 提供的相同类型的管道,您仍然需要将带有窗口过程的 DLL 注入(inject)到进程中。最好的方法是仍然使用 SetWindowsHookEx 来通过一个不执行任何操作的虚拟钩子(Hook)来完成此操作。

关于c - Hook 窗口消息循环 WM_CLOSE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13915332/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com