Цикл сообщений в Microsoft Windows

редактировать

Цикл сообщений - это обязательный участок кода в каждой программе, использующей графический интерфейс пользователя в Microsoft Windows. Программы для Windows, которые имеют графический интерфейс являются управляемыми событиями. Windows поддерживает отдельную очередь сообщений для каждого потока, создавшего окно. Обычно окна создаются только первым потоком. Windows помещает сообщения в эту очередь всякий раз, когда активность мыши происходит в окне этого потока, всякий раз, когда происходит активность клавиатуры, когда это окно находится в фокусе, и в другое время. Процесс также может добавлять сообщения в свою очередь. Чтобы принять ввод пользователя и по другим причинам, каждый поток с окном должен постоянно извлекать сообщения из своей очереди и действовать в соответствии с ними. Программист заставляет процесс сделать это, написав цикл, который вызывает GetMessage (который блокирует сообщение и извлекает его), а затем вызывает DispatchMessage (который отправляет сообщение) и повторяется бесконечно. Это цикл сообщений. Обычно в основной программе есть цикл сообщений, который выполняется в основном потоке, и дополнительный цикл сообщений в каждом созданном модальном диалоговом окне. Сообщения для каждого окна процесса проходят через его очередь сообщений и обрабатываются его циклом сообщений. Цикл сообщений - это один из видов цикла событий.

Базовый цикл сообщений выглядит следующим образом:

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { MSG msg; BOOL bRet; while (1) { bRet = GetMessage(amp;msg, NULL, 0, 0); if (bRet gt; 0) // (bRet gt; 0 indicates a message that must be processed.) { TranslateMessage(amp;msg); DispatchMessage(amp;msg); } else if (bRet lt; 0) // (bRet == -1 indicates an error.) { // Handle or log the error; possibly exit. //... } else // (bRet == 0 indicates "exit program".) { break; } } return msg.wParam; }

Обычно цикл обработки событий вызывает TranslateMessage каждое сообщение, которое может преобразовывать виртуальные нажатия клавиш в строки. Звонок TranslateMessage технически не требуется, но если его не вызвать, могут возникнуть проблемы. Цикл сообщений должен вызывать DispatchMessage.

Цикл сообщений не действует напрямую на обрабатываемые сообщения. Он отправляет их путем вызова DispatchMessage, который передает сообщение «оконной процедуре» для окна, которому было адресовано сообщение. («Оконная процедура» - это процедура обратного вызова, которая была связана с классом окна, когда он был зарегистрирован.) (Более чем одно окно может использовать одну и ту же оконную процедуру.)

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

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

Современные среды графического интерфейса, такие как Windows Forms, Windows Presentation Foundation, MFC, Delphi, Qt и другие, не требуют от приложений кодирования цикла сообщений Windows, поскольку они автоматически маршрутизируют такие события, как нажатия клавиш и щелчки мыши, в соответствующие обработчики, как определены в рамках. Однако каждая структура где-то реализует цикл сообщений, и к нему обычно можно получить доступ или заменить, когда требуется более прямой контроль.

Смотрите также
Внешние ссылки
Последняя правка сделана 2024-01-02 08:16:44
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте