Страницы

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

пятница, 28 февраля 2020 г.

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

#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)) ...

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

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