Если у меня есть следующий код ниже, как я могу определить, когда окно было закрыто, я могу уйти? r
никогда не получает значение
-1
0
, и мне нужно обрабатывать сообщения для всего потока, а не только для текущего окна.Циклы сообщений Win32: Выход после закрытия окна с помощью GetMessage (& msg, NULL, 0, 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);
}
Извините, я полностью забыл, что 'r == -1' не является близким. Но разве он также не должен выйти с 'r == 0'? Почему это не так? (Кстати, я 'WM_QUIT' никогда не отправляется в цикл.) – Mehrdad
@Mehrdad: Да, мой ответ был адресован, что' WM_QUIT' никогда не отправляется в цикл сообщений. Если 'GetMessage' получает' WM_QUIT', он возвращает значение 0. Предположительно, проблема в том, что вы никогда не отправляете * сообщение 'WM_QUIT'. Вам нужно обработать случай, когда окно закрыто, и использовать функцию '' PostQuitMessage' (http://msdn.microsoft.com/en-us/library/ms644945.aspx), чтобы указать, что цикл должен выйти. –
Ой, подождите ... так что, если мне нужно отправить его, и у меня есть несколько окон с большим количеством элементов управления внутри друг друга, как узнать, открылось ли я в последнем окне, и так ли я должен отправить его из WndProc? Не отслеживает это, становится довольно уродливым? – Mehrdad