Окно сообщений Windows, игнорирующее WM_CLOSE

У нас есть унаследованное приложение на C для Windows, которое вызывает модальное окно с помощью вызова MessageBox при возникновении фатальной ошибки соединения. Наши сетевые инженеры могут запускать многие из этих приложений одновременно. Иногда сбой в сети приводит к одновременному сбою соединений, обрабатываемых этими приложениями.

В Windows 7 выбор функции «Закрыть все окна» на панели задач работает, поскольку модальное диалоговое окно не обрабатывает сообщение WM_QUIT. Обычно я работаю в системах Linux, но мои исследования MSDN показывают, что единственный способ, которым я могу поймать и обработать это сообщение, — это создать свой собственный диалог и обработать сообщения самостоятельно.

Меня беспокоит то, что я упустил более простое решение, может ли кто-нибудь предложить альтернативы?

3

Решение

Цикл сообщений модального диалога должен перехватить 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(...);

...
2

Другие решения

Это может быть сложно.

Обычно, чтобы выйти из приложения Windows, вы должны выйти из «цикла сообщений Windows». Самый простой способ сделать это — отправить сообщение о выходе, например PostQuitMessage (retCode), где retCode — это значение, которое может обработать ваш основной обработчик цикла сообщений. Как правило, ноль, то есть игнорировать.

Обычно PostQuitMessage публикуется в ответ на сообщение WM_DESTROY.

Это действительно зависит от устаревшего кода, у вас есть мои симпатии, я имею дело и с устаревшим кодом. Мой код имеет отдельный цикл сообщений и постоянно отображает модальные диалоговые окна. Вызов EndDialog и вызов PostQuitMessage (0) правильно завершили мое приложение.

1

По вопросам рекламы [email protected]