#cpp #c #winapi
По каким причинам происходит следующее, если в функцию 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 не доходит.
Ответы
Ответ 1
Если получен WM_DESTROY, то окно уничтожается, его дескриптор становится невалидным, а функция GetMessageW будет продолжать вызываться с невалидным параметром и возвращать ошибку, но так как проверка возвращаемого значения сделана неверно, то цикл будет продолжать крутится. В документации прямо сказано, что так делать не стоит: Because the return value can be nonzero, zero, or -1, avoid code like this: while (GetMessage( lpMsg, hWnd, 0, 0)) ...
Комментариев нет:
Отправить комментарий