По каким причинам происходит следующее, если в функцию GetMessageW, 2м параметром передать HWND окна, при вызове PostQuitMessage в процедуре окна при получении сообщения WM_DESTROY, окно просто закрывается, но не уничтожается, и цикл обработки сообщений окна продолжает работать? При это, если передать NULL или nullptr, то при таком раскладе все отрабатывает нормально?
Так работает нормально
MSG msg{};
while (GetMessageW(&msg, nullptr, 0, 0))
{
TranslateMessage(&msg);
DispatchMessageW(&msg);
}
Но вот так, уже не завершится цикл.
MSG msg{};
while (GetMessageW(&msg, m_window_handle_, 0, 0))
{
TranslateMessage(&msg);
DispatchMessageW(&msg);
}
Помимо GetMessageW, c PeekMessageW происходит та же ситуация, т.е. сообщение WM_QUIT не доходит.
Ответ
Если получен WM_DESTROY, то окно уничтожается, его дескриптор становится невалидным, а функция GetMessageW будет продолжать вызываться с невалидным параметром и возвращать ошибку, но так как проверка возвращаемого значения сделана неверно, то цикл будет продолжать крутится. В документации прямо сказано, что так делать не стоит:
Because the return value can be nonzero, zero, or -1, avoid code like this:
while (GetMessage( lpMsg, hWnd, 0, 0)) ...
Комментариев нет:
Отправить комментарий