В чем разница между WM QUIT, WM CLOSE и WM DESTROY в программе windows?

Мне было интересно, в чем разница между сообщениями WM_QUIT, WM_CLOSE и WM_DESTROY в программе windows, по существу: когда они отправляются, и имеют ли они какие-либо автоматические эффекты, кроме того, что определено программой?

4 ответов


они совершенно разные.

WM_CLOSE отправляется в окно, когда" X "нажата или" закрыть " выбран из меню окна. Если вы поймаете это сообщение, это ваш звонок, как его лечить-игнорировать его или действительно закрыть окно. По умолчанию WM_CLOSE перешло к DefWindowProc приводит к уничтожению окна. Когда окно разрушается WM_DESTROY сообщение отправлено. На этой стадии, в противоположностьWM_CLOSE, вы не можете остановить процесс, вы можете только сделать необходимую очистку. Но помните об этом, когда поймаете WM_DESTROY как раз перед тем, как все дочерние окна уже уничтожены. WM_NCDESTROY отправить только после того, как все дочерние окна были разрушены.

WM_QUIT сообщение не связано ни с одним окном (hwnd получил от GetMessage равно NULL и не вызывается процедура окна). Это сообщение указывает, что цикл сообщений должен быть остановлен и приложение должно быть закрыто. Когда GetMessage читает WM_QUIT он возвращает 0, чтобы указать это. Взгляните на типичное сообщение фрагмент цикла - цикл продолжается в то время как GetMessage возвращает не-ноль. WM_QUIT может быть отправлено


прежде всего,WM_CLOSE и сообщения wm_destroy сообщения связаны с конкретными окнами, тогда как WM_QUIT сообщение применимо ко всему приложению (ну поток), и сообщение никогда не принимается через процедуру окна (WndProc routine), но только через GetMessage или PeekMessage функции.

в своем WndProc режима DefWindowProc функция заботится о поведении по умолчанию этих сообщений. Этот WM_CLOSE сообщения запрашивают, что приложение должно закрыть и по умолчанию behavoir для этого, чтобы вызвать сообщения wm_destroy сообщение говорит вам, что ваше окно IS будучи закрыт и уничтожен, поэтому вы должны очистить любые ресурсы, ручки и т. д.


просто, чтобы он не терялся в комментариях... не забывайте о WM_CANCEL. Когда вы нажимаете кнопку Закрыть (x) в диалоговом окне MFC, он, безусловно, отправит WM_CLOSE. Значение по умолчанию OnClose() функция вызовет значение по умолчанию (базовый класс) .

однако, если вы просто введите ESC ключ, это приведет к закрытию диалога, но (насколько я могу судить) без генерации WM_CLOSE событие-оно переходит непосредственно в WM_CANCEL/OnCancel() механизм.

настоящим я приглашаю сообщество подробнее остановиться на этом... или отредактируйте это уточнение в принятом ответе.


сначала обсудим WM_QUIT-отличие от других сообщений в том, что это не связано с окном. Он используется приложением. Например, это может быть обработано невидимым автономным Ole-сервером (.exe, но не в прок, как .dll файлы)

WM_CLOSE-на msdn:"приложение может запросить у пользователя подтверждение, прежде чем уничтожить окно" - это используется в качестве уведомления о намерении закрыть (вы можете отказаться от этого намерение.)

WM_DESTROY-это факт, что окно закрывается и все ресурсы должны(!) быть освобожденным.