Очереди сообщений

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

система поддерживает очередь сообщений единой системы и любое количество очередей сообщений потока, один для каждого потока графического интерфейса пользователя. Чтобы избежать издержек создания очереди сообщений для потоков-GUI, все потоки, изначально создаются без очереди сообщений. Система создает очереди сообщений потока только тогда, когда поток делает его первого вызова одной из функций Win32 пользователя или GDI.

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

За исключением сообщение WM_PAINT , система всегда сообщений сообщения в конце очереди сообщений. Это гарантирует, что окно получает входящие сообщения в правильной последовательности first-in, first-out (FIFO). Сообщение WM_PAINT, однако, хранится в очереди и пересылается процедуре окна только тогда, когда очередь содержит не других сообщений. Множественные сообщения WM_PAINT для окна же комбинируются в одно сообщение WM_PAINT, консолидации все недопустимые части клиентской области в одной области. Объединение сообщения WM_PAINT уменьшает количество раз, окно необходимо обновить содержимое клиентской области.

Система посылает сообщение в очередь сообщений потока заполнив структурой MSG и затем скопировать его в очередь сообщений. Информация в MSG включает: дескриптор окна, для которого сообщение является предназначены, идентификатор сообщения, два параметры сообщения, время было сгенерировано сообщение, и позиция курсора мыши. Поток может оставлять сообщения в очередь сообщений или очередь другого потока, используя функцию PostMessage или PostThreadMessage.

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

После удаления сообщения из очереди, приложение может использовать функцию DispatchMessage для руководства системы отправлять сообщение процедуре окна для обработки. DispatchMessage принимает указатель на MSG , которая была заполнена в результате предыдущего вызова функции GetMessage или PeekMessage . DispatchMessage передает дескриптор окна, идентификатор сообщения и два параметра сообщение процедуре окна, но не пройти время, которое было сгенерировано сообщение или положение курсора мыши. Приложение может получить эту информацию путем вызова функции GetMessageTime и GetMessagePos при обработке сообщения.

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

Можно вызвать функцию SetMessageExtraInfo для связи 32-разрядное значение с очередью сообщений текущего потока. Затем необходимо вызовите функцию GetMessageExtraInfo для того чтобы получить значение, связанное с последним сообщением по функции GetMessage или PeekMessage.

Index