【问题标题】:When to call PostQuitMessage何时调用 PostQuitMessage
【发布时间】:2011-08-16 20:08:45
【问题描述】:

与许多应用程序一样,我的应用程序会创建多个窗口。我不知道也无法跟踪创建了多少个窗口,所以我不知道什么时候没有。

我的问题是,当所有窗口都关闭时,除非我以某种方式调用PostQuitMessage,否则应用程序会在没有打开窗口的情况下继续运行(显然)。我无法在消息处理程序中调用PostQuitMessage 来响应WM_DESTROY 消息,因为这将在第一个窗口关闭时关闭所有窗口,即使还有二十个窗口仍然打开。

我的问题是我如何知道何时调用PostQuitMessage(0) 来实际终止应用程序?

【问题讨论】:

  • 为什么你不知道打开了多少个窗口?
  • @Gabe 因为显然我太愚蠢了,看不出它是多么简单。

标签: c++ c winapi application-close


【解决方案1】:

如果由于某种原因,您真的无法计算应用程序打开了多少个窗口,您仍然可以使用EnumThreadWindows(),当没有更多窗口时,您可以使用PostQuitMessage()。如果您有多个线程,请确保您也枚举了这些线程。

来自MSDN

BOOL WINAPI EnumThreadWindows(
  __in  DWORD dwThreadId,
  __in  WNDENUMPROC lpfn,
  __in  LPARAM lParam
);

【讨论】:

    【解决方案2】:

    只需保留一个统计打开窗口数量的静态变量。当一个窗口打开时,它会增加计数器;在 WM_DESTROY 处理程序中减少它。当计数变为零时,调用 PostQuitMessage。

    【讨论】:

    • 哇,不知道为什么我没有想到这一点。这是跟踪现有窗口数量的常用方法吗?
    • @Seth,大多数应用程序都有一个主窗口,即使它们打开了其他窗口,所以不,这并不常见。
    • 那么主窗口有单独的窗口过程吗?您显然不能在子窗口使用的 wndproc 中拥有 PostQuitMessage。我是win32 GUI编程的新手,请原谅我的无知。
    【解决方案3】:

    当然,唯一干净的方法是跟踪您的窗口并在没有留下任何信息时发布退出消息。

    一种可能的解决方法是使用窗口枚举函数之一。您可以使用 EnumWindows() 来计算您的窗口,它会调用一个回调,您可以在其中计算所有顶级窗口。如果达到零,请调用 PostQuitMessage()。

    【讨论】:

      【解决方案4】:

      窗口数量的静态变量? 我从未见过这样的程序。 一方面儿童窗户可以在整个生命周期中打开和关闭 应用。 另一方面,主窗口程序必须关闭应用程序, 如果用户关闭主窗口。 为此,我们必须在 WM_DESTROY 分支中添加 PostQuitMessage(0) 的主窗口过程。在此消息之后,GetMessage() 返回 0 并且 消息循环因此结束(应用程序也结束)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-06
        • 1970-01-01
        • 2016-02-11
        • 2019-02-05
        • 1970-01-01
        相关资源
        最近更新 更多