3

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

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

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

4

4 回答 4

5

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

来自MSDN

BOOL WINAPI EnumThreadWindows(
  __in  DWORD dwThreadId,
  __in  WNDENUMPROC lpfn,
  __in  LPARAM lParam
);
于 2011-08-16T20:18:35.883 回答
4

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

于 2011-08-16T20:17:30.837 回答
1

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

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

于 2011-08-16T20:19:06.203 回答
0

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

于 2013-09-01T22:39:52.383 回答