PostQuitMessage () Не закроете мое приложение? - PullRequest
1 голос
/ 29 августа 2009

Я пытаюсь написать hello world в win32, но когда я закрываю главное окно, приложение продолжает работать

Моя процедура окна:

LRESULT CALLBACK MainWndProc(HWND hWnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
    switch (msg)
    {
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc(hWnd, msg, wparam, lparam);
}

Цикл событий:

while ((bret = GetMessage(&msg, hWndMain, 0, 0) != 0)
{
    if (bret == -1)
    {
        DWORD error = GetLastError();
        return 1;
    }
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}

Теперь я получаю WM_DESTROY, нажимая на правый верхний угол x. Вместо GetMessage (), возвращающего 0 для обозначения получения WM_QUIT, вместо этого он возвращает -1, а GetLastError () жалуется на ошибку 1400, которая «недействительна». оконная ручка " ... я в недоумении.

Ответы [ 2 ]

10 голосов
/ 29 августа 2009

Обычно вы передаете NULL, а не дескриптор окна, на GetMessage(), это объясняет, почему вы получаете ERROR_INVALID_WINDOW_HANDLE, поскольку после WM_DESTROY и завершения друзей окно больше не будет существовать. Сообщение WM_QUIT, отправленное PostQuitMessage(), является потоком сообщений, поэтому GetMessage с дескриптором никогда не получит его.

Это подробности реализации, но PostQuitMessage даже не публикует реальное сообщение, это просто флаг, сохраненный потоком, и GetMessage автоматически сгенерирует сообщение при необходимости, см. это сообщение в блоге для получения более подробной информации. .

0 голосов
/ 17 октября 2011

Я лично это делаю:

if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
   if(msg.message == WM_QUIT)
   {
      break;
   }

   TranslateMessage(&msg);
   DispatchMessage(&msg);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...