Изучение очереди сообщений

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

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

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

HWND hwnd; 
BOOL fDone; 
MSG msg; 
 
/ / Начнется операция и будет продолжаться до тех пор, пока он будет завершен / / или до тех пор, пока пользователь щелкает мышью или нажатии клавиши. 
 
fDone = F&ALSE; 
в то время как (! fDone) {fDone = DoLengthyOperation(); / / определяемые приложением функция / / удалить все сообщения, которые могут находиться в очереди. Если / / очередь содержит любой мыши или клавиатуры / / сообщения, конец операции. 
 
    во время (PeekMessage (amp; msg, hwnd, 0, 0, PM_REMOVE)) {switch(msg.message) {WM_LBUTTONDOWN, дело: дело WM_RBUTTONDOWN: дело WM_KEYDOWN: / / / / выполнить требуемые очистку. 
                / / fDone = TRUE; 
        } 
    } 
} 
 

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

Index