У нас есть унаследованное приложение на C для Windows, которое вызывает модальное окно с помощью вызова MessageBox при возникновении фатальной ошибки соединения. Наши сетевые инженеры могут запускать многие из этих приложений одновременно. Иногда сбой в сети приводит к одновременному сбою соединений, обрабатываемых этими приложениями.
В Windows 7 выбор функции «Закрыть все окна» на панели задач работает, поскольку модальное диалоговое окно не обрабатывает сообщение WM_QUIT. Обычно я работаю в системах Linux, но мои исследования MSDN показывают, что единственный способ, которым я могу поймать и обработать это сообщение, — это создать свой собственный диалог и обработать сообщения самостоятельно.
Меня беспокоит то, что я упустил более простое решение, может ли кто-нибудь предложить альтернативы?
Цикл сообщений модального диалога должен перехватить WM_QUIT
и в ответ на звонок EndDialog()
и передать WM_QUIT
сообщение в главное окно приложения, используя PostMessage()
,
Обновить:
Подход, предложенный выше, будет работать, если WM_QUIT
будет послан в модальное диалоговое окно … — но по крайней мере на моей текущей машине win7 это не так.
Кроме того, это случай, когда главное окно получает WM_SYSCOMMAND
с wParam
установлен в SC_CLOSE
и каким-то образом обработчик сообщений по умолчанию игнорирует его (что может быть связано со стилями модального диалогового окна …? Я не исследовал это дальше.).
Тем не менее, добавив следующую ветку в главный цикл сообщений окна switch
следует выполнить работу по прекращению приложения в условиях, описанных ОП:
...
case WM_SYSCOMMAND:
if (SC_CLOSE == wParam)
{
PostQuitMessage(<whatever code shall be returned>);
}
return DefWindowProc(...);
...
Это может быть сложно.
Обычно, чтобы выйти из приложения Windows, вы должны выйти из «цикла сообщений Windows». Самый простой способ сделать это — отправить сообщение о выходе, например PostQuitMessage (retCode), где retCode — это значение, которое может обработать ваш основной обработчик цикла сообщений. Как правило, ноль, то есть игнорировать.
Обычно PostQuitMessage публикуется в ответ на сообщение WM_DESTROY.
Это действительно зависит от устаревшего кода, у вас есть мои симпатии, я имею дело и с устаревшим кодом. Мой код имеет отдельный цикл сообщений и постоянно отображает модальные диалоговые окна. Вызов EndDialog и вызов PostQuitMessage (0) правильно завершили мое приложение.