Когда звонить PostQuitMessage - PullRequest
3 голосов
/ 17 августа 2011

Как и многие приложения, мое создает несколько окон.Я не знаю и не могу отслеживать, сколько окон было создано, поэтому я не знаю, когда их нет.

Моя проблема в том, что когда все окна закрыты, если я не вызову PostQuitMessageкаким-то образом приложение продолжает работать без открытых окон (очевидно).Я не могу вызвать PostQuitMessage в обработчике сообщений в ответ на сообщение WM_DESTROY, потому что оно закроет все окна, когда первое будет закрыто, даже если есть еще двадцать других открытых.

МойВопрос в том, как узнать, когда позвонить PostQuitMessage(0), чтобы фактически закрыть приложение?

Ответы [ 4 ]

5 голосов
/ 17 августа 2011

Если по какой-то причине вы действительно не можете сосчитать, сколько окон открывает приложение, вы все равно можете использовать EnumThreadWindows(), а когда окон больше нет, вы PostQuitMessage().Если у вас есть несколько потоков, убедитесь, что вы перечислите их тоже.

С MSDN

BOOL WINAPI EnumThreadWindows(
  __in  DWORD dwThreadId,
  __in  WNDENUMPROC lpfn,
  __in  LPARAM lParam
);
4 голосов
/ 17 августа 2011

Просто сохраняйте статическую переменную со счетчиком количества открытых окон.Когда окно открывается, оно увеличивает счетчик;в обработчике WM_DESTROY уменьшите его.Когда счетчик обнулится, вызовите PostQuitMessage.

1 голос
/ 17 августа 2011

Конечно, единственный чистый способ - следить за своими окнами и публиковать сообщение о выходе, если ничего не осталось.

Возможный обходной путь - использовать одну из функций перечисления окон. Вы можете сосчитать ваши окна, используя EnumWindows (), который вызывает обратный вызов, где вы можете сосчитать все окна верхнего уровня. Если он достигает нуля, вызовите PostQuitMessage ().

0 голосов
/ 02 сентября 2013

Статическая переменная для количества окон?Я никогда не видел такой программы.Одно-одно дочерние окна могут открываться и закрываться в течение всего времени жизни приложения.С другой стороны, процедура главного окна должна закрывать приложение, если пользователь закрывает главное окно.Для этого нам нужно добавить PostQuitMessage (0) в ветку WM_DESTROY процедуры главного окна.После этого сообщения GetMessage () возвращает 0, и цикл сообщений заканчивается из-за этого (и приложение также завершается)

...