PeekMessage()

Помните, что функция GetMessage() является блокирующей. То есть она ожидает пока не будет получено сообщение из очереди. До этого момента программа стоит. Что делать, если надо просто проверить есть ли сообщение в очереди. Зачем ??? Например, чтобы занять программу в этот момент другими действиями, например, упаковкой базы данных. Для этого и есть функция PeekMessage(). Она проверяет есть ли в очереди сообщение и программа выполняется дальше.

BOOL PeekMessage
(
LPMSG lpMsg,// Указатель на структуру MSG
HWND hWnd,// Указатель на окно (кому сообщение)
UINT wMsgFilterMin,// для маски минимум
UINT wMsgFilterMax,// для маски максимум
INT wRemoveMsg// Что делать с сообщением
);

Единственный последний параметр нам не знаком. Вот какой он может быть:

PM_NOREMOVEНе удалять сообщение из очереди
PM_REMOVEУдалять сообщения из очереди

Эта функция вернет ненулевое значение, если в очереди есть сообщения. Если фильтра нет, то будут получены все сообщения, при наличии фильтра только по фильтру. Обратите внимание, что GetMessage() вернет WM_QUIT даже при фильтре. Пример использования ее может быть такой.

while (true)
{
while (!::PeekMessage(&m_msgCur, NULL, NULL, NULL, PM_NOREMOVE))
{
// функция для работы пока нет сообщений
}
if (!::GetMessage(&m_msgCur, NULL, NULL, NULL)) break;
::TranslateMessage(&m_msgCur);
::DispatchMessage(&m_msgCur);
}
 
« Предыдущая статья   Следующая статья »