Сообщения и очереди. Трансляция клавиш ускорения. Фильтрация сообщений, страница 2

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

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

. . .

/* прервать операцию в/в и проконтролировать очередь на сообщения */

if(PeekMessage((LPMSG)msg,(HWND)NULL,0,0))

if((msg.type==WM_COMMAND)&&(msg.wParam==IDABORT))

AbortIO( );

/* продолжить операцию в/в */

. . .

PeekMessage подобно GetMessage ожидает сообщений, которые должны быть помещены в очередь. Это позволяет другим ПП взять управление и обработать свои собственные сообщения, если очередь ПП пуста. WINDOWS возвращает управление ПП, когда сообщение помещается в очередь.

5.3.6. Сообщения SendMessage и PostMessage

Функции SendMessage и PostMessage позволяют прикладным программам передавать сообщения своим окнам или окнам других ПП.

Функция SendMessage заставляет WINDOWS послать сообщение непосредственно данной функции окна, обходя очередь  ПП. WINDOWS не возвращает управление вызывающей ПП до тех  пор, пока функция окна, принимающая сообщение, не обработает его. Обычно SendMessage используется для посылки сообщений дочерним окнам.

Функция PostMessage заставляет WINDOWS передать сообщение, помещая его в очередь ПП. Она сразу же возвращает управление вызывающей ПП, и выполнение любого действия, которое должно быть произведено как результат сообщения, откладывается до тех пор, пока сообщение не будет считано из очереди.

5.3.7. Удаляющие сообщения

Можно удалять сообщения из очереди ПП, используя функцию PeekMessage. Например, в приведенном ниже фрагменте из очереди удаляются сообщения клавиатуры:

while(PeekMessage((LPMSG)&msg,WM_KEYFIRST,WM_KEYLAST,TRUE))

Константы WM_KEYFIRST и WM_KEYLAST могут быть использованы для сброса всей информации, вводимой с клавиатуры, а константы WM_MOUSEFIRST и WM_MOUSELAST могут быть использованы для сброса всей информации, вводимой с "мыши".

Не все сообщения могут быть удалены таким образом. В частности, WINDOWS продолжает посылать сообщения WM_PAINT

прикладной  программе  до тех пор, пока соответствующее окно не будет нарисовано или освобождено от перерисовки.

5.3.8. Использование функций сообщений

В большинстве ПП только основная функция использует функции сообщений для извлечения сообщений из очереди. Любая функция окна может также вызвать функции, если имеется специальная потребность во вводе, таком как перемещение "мыши" или последовательное считывание строки нажатых клавиш. ПОЛИФЕЙС не накладывает никаких ограничений на то, когда или где функция сообщения может быть вызвана.