Страницы

Поиск по вопросам

четверг, 16 мая 2019 г.

WINAPI GetMessageW не перестает принимать сообщения после вызова PostQuitMessage

По каким причинам происходит следующее, если в функцию 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)) ...

Комментариев нет:

Отправить комментарий