Когда звонить PostQuitMessage
Как и многие приложения, мое создает несколько окон. Я не знаю и не могу отслеживать, сколько окон было создано, поэтому я не знаю, когда их нет.
Моя проблема в том, что когда все окна закрыты, если я не позвоню PostQuitMessage
каким-то образом приложение продолжает работать без открытых окон (очевидно). Я не могу позвонить PostQuitMessage
в обработчике сообщений в ответ на WM_DESTROY
сообщение, потому что это закроет все окна, когда первое закрыто, даже если еще двадцать других еще открыты.
Мой вопрос, как я знаю, когда позвонить PostQuitMessage(0)
на самом деле прекратить приложение?
4 ответа
Просто держите статическую переменную со счетчиком количества открытых окон. Когда окно открывается, оно увеличивает счетчик; в обработчике WM_DESTROY уменьшите его. Когда счетчик обнулится, вызовите PostQuitMessage.
Если по какой-то причине вы действительно не можете сосчитать, сколько окон открывает приложение, вы все равно можете использовать EnumThreadWindows()
и когда нет больше окон, вы PostQuitMessage()
, Если у вас есть несколько потоков, убедитесь, что вы тоже перечислили их.
Из MSDN
BOOL WINAPI EnumThreadWindows(
__in DWORD dwThreadId,
__in WNDENUMPROC lpfn,
__in LPARAM lParam
);
Конечно, единственный чистый способ - следить за вашими окнами и публиковать сообщение о выходе, если ничего не осталось.
Возможный обходной путь - использовать одну из перечисляющих функций окна. Вы можете сосчитать ваши окна, используя EnumWindows(), который вызывает обратный вызов, где вы можете сосчитать все окна верхнего уровня. Если он достигает нуля, вызовите PostQuitMessage().
Статическая переменная для количества окон? Я никогда не видел такой программы. Одно-одно дочерние окна могут открываться и закрываться в течение всего времени жизни приложения. С другой стороны, процедура главного окна должна закрывать приложение, если пользователь закрывает главное окно. Для этого нам нужно добавить PostQuitMessage(0) в ветку WM_DESTROY процедуры главного окна. После этого сообщения GetMessage() возвращает 0, и цикл сообщений заканчивается из-за этого (и приложение тоже заканчивается)