- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想“保护”某个窗口不被关闭。所以我想 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);
}
我尝试过:
我还注意到,如果我 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/
我正在为自定义对话框使用特殊的消息循环。当对话框打开并且窗口关闭时,我想达到下面的第二个 if(msg.message == WM_CLOSE)。 for(;;) { if(PeekMessa
本文对WM_CLOSE、WM_DESTROY、WM_QUIT及各种消息投递函数的功能及区别做出了分析比对,有助于读者更好的对消息投递函数加以理解。详情如下: 1、WM_CLOSE、WM_DEST
我正在创建一个简单的 C# 应用程序来监视服务器上的公开应用程序,如果有任何消息框出现一个特定的窗口名称,则关闭该窗口并继续该过程。供应商随机出现信息消息框,它会挂起应用程序,直到单击 X 或 OK
我将子 hwnd 创建为带有关闭按钮的弹出窗口,并使用 WndchildProc 来处理来自子窗口的消息 m_childHwnd = CreateWindowEx( NULL, TEXT("STATI
我想“保护”某个窗口不被关闭。所以我想 Hook WM_CLOSE、WM_DESTOY 或 WM_QUIT。这就是我尝试这样做的: LRESULT CALLBACK WindowHookProc(in
我正在尝试从 C++ 应用程序关闭 C# .NET 4 WPF 应用程序。 C++ 应用程序使用枚举窗口的标准技术,找到对应于给定进程 ID 的窗口,通过 PostMessage 向窗口发送 WM_C
我知道在 Windows 通知消息中,WM_CLOSE 指的是通过窗口右上角的“X”按钮关闭窗口。 有谁知道用 File->Exit 关闭的通知消息? 我问的原因是因为我正在尝试实现 JNI nati
如何编写一个 WinForms 应用程序,它除了托盘图标外没有任何可见元素,同时允许该应用程序在文件正在使用时由 Windows Installer 关闭?据我了解,Windows Installer
当模态对话框处于事件状态时,主应用程序窗口是否可以检测到 WM_CLOSE 事件?。如果没有,是否有任何方法可以检测到 WM_CLOSE 事件,因为对话框的事件处理程序也没有检测到它。 要亲自观察此行
开始一个进程- ProcessStartInfo psi = new ProcessStartInfo("G:\\SampleWinApp.exe"); psi.UseShe
我有一个调用我的应用程序的外部应用程序,应该在工作完成后结束它。来自此外部应用程序的日志声称它在我的应用程序上使用了 WM_CLOSE。 如何在我的应用程序中截取 WM_CLOSE 消息来执行一些清理
我正在使用 Tray 应用程序。 Onj FormCloseQuery 我检查程序是否应该转到托盘,而不是关闭它,而是将其放入托盘中(CanClose := False) 但是,如果 Windows
我只想知道这两个消息常量有什么区别。覆盖时,我应该在 WndProc 方法中使用哪一个来处理关闭按钮消息。 最佳答案 WM_CLOSE无论何时以任何方式请求关闭窗口,都会作为窗口消息发送。 SC_CL
我只想知道这两个消息常量有什么区别。覆盖时,我应该在 WndProc 方法中使用哪一个来处理关闭按钮消息。 最佳答案 WM_CLOSE无论何时以任何方式请求关闭窗口,都会作为窗口消息发送。 SC_CL
当我使用 DialogBox 创建对话框时, 它不会关闭,除非我在我自己的 DLGPROC 函数中处理 WM_CLOSE 并调用 EndDialog。 我知道这是设计使然,但我很感兴趣为什么选择 WM
我创建了简单的 handler inside my QApplication : bool QtMyApplication::winEventFilter ( MSG * msg, long * re
我有一个基于对话框的 MFC 应用程序,它需要停止 Windows Wifi 服务才能正常运行,但我想在我的应用程序退出时再次启用它。 所以我想我应该将重启服务的代码放在主对话框类的析构函数中。 现在
我正在调用 HtmlHelpA winapi 方法来显示我的应用程序的 .chm。此方法立即返回一个 HWND,并且帮助窗口显示为一个单独的窗口。 除了窗口,我还为这个 hwnd 设置了一个计时器。我
尝试在 Windows 7 的任务栏缩略图中使用关闭按钮关闭窗口时尝试设置“你想保存吗”对话框(启用 aero peek)。 在处理 WM_CLOSE 时使用 MessageBox() 不起作用。 M
我们有一个遗留的 C Windows 应用程序,它在发生致命连接错误时通过 MessageBox 调用弹出一个模式窗口。我们的网络工程师可能同时运行其中的许多应用程序。有时,网络故障会导致这些应用程序
我是一名优秀的程序员,十分优秀!