Я не думаю, что неправильно вызывать PostQuitMessage в ответ на WM_QUERYENDSESSION.
WM_ENDSESSION - это конец света. В этот момент уже слишком поздно откладывать работу на потом (вызывая PostQuitMessage). Сделай это сейчас, или у тебя никогда не будет шанса сделать это. Кроме того, подумайте, что вы делаете. Как однажды сказал Рэймонд Чен: «[очистка вашего приложения в ответ на WM_ENDSESSION] это все равно, что потратить время на чистку ковров паром перед тем, как разрушить здание. Напрасные усилия».
WM_QUERYENDSESSION предоставляет вашему окну последний шанс взаимодействовать с пользователем. Вы решили от имени пользователя, что ваше приложение умрет, и вы хотите изящно выйти, так что это ваша последняя возможность запланировать его.
Обновлено
Я не знаю, будет ли это работать на PostQuitMessage в ответ на WM_QUERYENDSESSION. Состояние документа MSDN: «Сообщение WM_ENDSESSION отправлено приложению после того, как система обработает результаты сообщения WM_QUERYENDSESSION.»
Отправлено означает, что насос сообщений не получает трещины в сообщениях. Конечно, даже авторы документов часто путают отправлено и отправлено .