Цикл обработки сообщений

Простое сообщение цикл состоит из одной функции вызова для каждого из этих трех функций: GetMessage, TranslateMessageи DispatchMessage.

MSG msg;

во время (GetMess&age (amp; msg, NULL, 0, 0))
{
    TranslateMessage (и msg);
    DispatchMessage (и msg);
} 

Функция GetMessage получает сообщение из очереди и копирует его в структуре типа MSG. Он возвращает ненулевое значение, если только не встречается сообщение WM_QUIT , в этом случае он возвращает значение FALSE и завершает цикл. В однопоточных приложений конец цикла обработки сообщений часто является первым шагом при закрытии приложения. Приложение может завершить свою собственную цикла, используя функцию PostQuitMessage обычно в ответ на сообщение WM_DESTROY в процедуре окна главного окна приложения.

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

Цикл обработки сообщений потока должна включать TranslateMessage если поток будет получать ввод символов с клавиатуры. Система генерирует виртуальный ключ сообщения (WM_KEYDOWN и WM_KEYUP) каждый раз, когда пользователь нажимает клавишу. Виртуальная клавиша сообщение содержит виртуальный ключ код, который идентифицирует, какие клавиша была нажата, но не его значение символа. Чтобы получить это значение, цикл обработки сообщений должен содержать TranslateMessage, который переводит виртуальный ключ сообщения в сообщение символов (WM_CHAR) и помещает его в очередь сообщений приложения. Символ сообщение затем может быть удален после последующей итерации цикла обработки сообщений и в процедуре окна направлена.

DispatchMessage функция отправляет сообщение процедуре окна, связанные с дескриптором окна, указанный в структуре MSG . Если дескриптор окна HWND_TOPMOST, DispatchMessage посылает сообщение окно процедуры всех окон верхнего уровня в системе. Если дескриптор окна равно NULL, DispatchMessage не делает ничего с сообщением.

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

Цикл обработки сообщений только одно необходима для очереди сообщений, даже если приложение содержит множество окон. DispatchMessage всегда отправляет сообщение в окне надлежащего; Это потому, что каждое сообщение в очереди является структурой MSG , содержащая дескриптор окна, которому принадлежит сообщение.

Вы можете изменить цикл обработки сообщений в по-разному. Например можно получить сообщения из очереди без направления их в окно. Это полезно для приложений, которые публиковать сообщения, не указывая окна. Также можно непосредственно GetMessage для поиска определенных сообщений, оставляя другие сообщения в очереди. Это полезно, если вы должны временно обойти обычные FIFO порядка очереди сообщений.

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

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

Index