Циклы сообщений Win32: выход после закрытия окна с GetMessage (& msg, NULL, 0, 0)? - PullRequest
1 голос
/ 04 февраля 2011

Если у меня есть следующий код ниже, как я могу определить, когда окно было закрыто, чтобы я мог выйти?r никогда не получает значение -1 0, и мне нужно обрабатывать сообщения для всего потока, а не только для текущего окна.

HWND hWnd = CreateWindowExW(0, L"Edit", L"My Window", WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT, CW_USEDEFAULT, 300, 200, NULL, NULL, NULL, NULL);
ShowWindow(hWnd, SW_SHOWDEFAULT);
MSG msg;
BOOL r;
while ((r = GetMessageW(&msg, NULL, 0, 0)) != 0)
{
    if (r == -1) { break; }
    TranslateMessage(&msg);
    DispatchMessageW(&msg);
}

Ответы [ 2 ]

3 голосов
/ 04 февраля 2011

Ожидание r = -1 - это не то, как вы обнаруживаете, что ваше окно закрыто.Возвращаемое значение -1 не является нормальным условием: оно указывает на то, что в цикле сообщений произошла ошибка.

Из документации :

Возвращаемое значение

Тип: BOOL

Если функция получает сообщение, отличное от WM_QUIT, возвращаемое значение отлично от нуля.

Если функция получает сообщение WM_QUIT, возвращаемое значение равно нулю.

Если имеется ошибка, возвращаемое значение равно -1.Например, функция завершается ошибкой, если hWnd - недопустимый дескриптор окна или lpMsg - недопустимый указатель.Чтобы получить расширенную информацию об ошибке, позвоните GetLastError.

Когда GetMessage получает сообщение WM_QUIT из очереди, он вернет значение 0, и вы должны завершить цикл.

Если вы просто хотите узнать, когда окно закрылось, вы, вероятно, захотите обработать сообщения WM_CLOSE или WM_DESTROY.Для обсуждения этих сообщений см. Ответы на этот вопрос: В чем разница между WM_QUIT, WM_CLOSE и WM_DESTROY в программе Windows?

0 голосов
/ 08 июля 2014

Я нашел решение для этого: WM_NULL.
Цикл сообщений может обрабатывать вопрос самостоятельно независимо от WndProc:

// written in C# 
MSG msg = new MSG();
while (GetMessage(out msg, window, 0, 0))
{
    if ((msg.message == WM_NULL) && !IsWindow(window))
        break;
    TranslateMessage(ref msg);
    DispatchMessage(ref msg);
}
Console.WriteLine("yeah, out of loop ^^");

Из моих наблюдений: Когда окно разрушено GetMessage извлекает WM_NULL сообщения без паузы (1-я подсказка) и IsWindow может проверить окно (подтверждение).

...