【发布时间】:2012-12-02 02:10:29
【问题描述】:
我有一个多线程应用程序,它可能会显示一个 MessageBox 以供用户交互。在用户从应用程序的系统托盘图标中选择上下文菜单命令后,消息框本身会从工作线程中显示,因此从技术上讲,用户可以在显示消息框时继续使用该应用程序。这很有效,直到用户发出“退出”命令,此时我需要找到一种方法来关闭所有打开的消息框。
我做了功课,我能够获得消息框的主(对话框)窗口的 HWND 句柄 (using this method)。我使用 Spy++ 检查了 HWND 是否正确,因此 HWND 本身不是问题。发生的情况是,当我从另一个线程对消息框执行 PostMessage(hMsgBoxWnd, WM_CLOSE, 0, 0); 时,它只是忽略此消息并且不会关闭。
知道如何通过窗口句柄关闭消息框吗?
【问题讨论】:
-
我认为通过显示一个看起来像消息框的对话框会更容易处理,因此您知道要发送什么消息才能关闭它。
-
这很奇怪,因为我发誓我以前在某个地方使用过完全相同的技术,而且效果很好。
-
@JerryCoffin:是的,但它也需要我重写很多代码。我会先尝试找到这个问题的解决方案...
-
我不知道为什么 WM_CLOSE 不起作用,但您也可以尝试发布 WM_COMMAND 消息来模拟单击其中一个按钮(例如
PostMessage(hMsgBoxWnd, WM_COMMAND, MAKEWPARAM(IDCANCEL, BN_CLICKED), 0); -
@JonathanPotter:似乎 MessageBox API 仍然使用主线程消息泵,即使我从工作线程调用它,这似乎是 WM_CLOSE 陷入困境的原因......
标签: c++ windows winapi messagebox