WinPro logo. Перейти на сайт www.winpro.narod.ru

Пример проверки очереди сообщений



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

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

В следующем примере показано использование функции PeekMessage в течение выполнения длительных операций:

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