Помните, что функция 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); }