Имеет ли приложение win32 один цикл сообщений? Или это один цикл сообщений для каждого окна?

Я немного смущен тем, как работают петли сообщений в программировании win32. В моем WinMain я всегда ставил следующее:

while ( GetMessage ( &msg, NULL, 0, 0 ) > 0 )
{
    TranslateMessage ( &msg );
    DispatchMessage ( &msg );
}

Это цикл while, который в значительной степени выполняется до тех пор, пока ваше приложение не остановится. Означает ли это, что у вас есть один цикл сообщений для каждого приложения, а не для каждого окна?

Ответ 1

Из О сообщениях и очередях сообщений:

Приложения с несколькими потоками могут включать цикл сообщений в каждом потоке, который создает окно.

Обратите внимание, что очередь messsage CAN поддерживает несколько окон... Второй параметр GetMessage - это дескриптор окна, которое вы хотите смотреть сообщения для. Если NULL, то все окна потока.

В качестве второй заметки можно создать очередь сообщений без окон (по крайней мере, начиная с Windows 2000). Он описан в документации для PostThreadMessage:

В потоке, на который будет отправлено сообщение, вызовите PeekMessage, как показано здесь, чтобы заставить систему создать очередь сообщений.

PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE)