【问题标题】:How to close a MessageBox window by its handle with C++如何通过 C++ 的句柄关闭 MessageBox 窗口
【发布时间】: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


【解决方案1】:

MessageBox() 根本不会在所有情况下处理WM_CLOSE

SendMessage/PostMessage WM_CLOSE to MessageBox window does not always work

【讨论】:

    【解决方案2】:

    您应该使用 PostThreadMessage 发布到线程特定的消息队列

    【讨论】:

    • 您可能有一点,尽管 PostThreadMessage 在我的情况下不起作用,因为该工作线程没有消息泵......
    • @user843732,您可以添加一个快速的PeekMessage 循环,以免严重干扰该线程的其他组件。
    • @chris:你看到的问题是(就像我在上面发布的那样)MessageBox 显然仍然使用主线程来获取它的消息。我知道这是因为当我指定 NULL 作为它的第一个参数时,我的关闭方法开始起作用。这里的问题是 MessageBox 然后在我不想要的任务栏上创建自己的按钮...
    • @user843732,说这话我觉得很糟糕,但如果这是唯一的问题,你可以使用SetWindowLongPtr将消息框的扩展样式更改为WS_EX_TOOLWINDOW。 .在需要完成之前,这应该作为最后的手段。
    • 另一种选择是使用 SetWindowsHookEx 并拦截 windows 消息框消息,或者制作一个自动关闭的消息框。本文讨论如何自定义标准消息框:catch22.net/tuts/custom-messagebox
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多