Как видно, параметры функции позволяют заполнить соответствующие поля структуры данных типа MSG, кодирующей посылаемое сообщение.

Функция SendMessage() может вызывать оконную процедуру напрямую, минуя очередь. Но даже если это не так, следующий после SendMessageC) оператор не получит управление, пока обработка сообщения не будет завершена. Сообщение, посылаемое функцией SendMessageC), выше по приоритету не только аппаратных, но и программных сообщений. Функция может разослать и циркулярные сообщения. В качестве интересного примера можно выполнить в программе вызов функции SendMessage(HWND_BROADCAST.WM_CLOSE.0,0), а потом стоит посмотреть, как система отреагировала на посланное сообщение.

Чтобы обновить изображение в окне, можно заставить оконную процедуру выполнить ветвь case WM_PAINT, послав ей сообщение SendMessage(hWnd, WM_PAINT.0.0). Функция UpdateWindow(hWnd) работает схожим образом. Минуя постановку в очередь, она вызывает оконную процедуру, передавая ей WM_PAINT, и после завершения оконной процедуры возвращает управление. Но она передает оконной функции сообщение WM_PAINT, только если в изображении окна произошли изменения. Если их нет, то UpdateWindow() не вызывает оконную процедуру.

Функция PostMessage() ставит сообщение в очередь окна и сразу возвращает управление. Это означает, что сформированное сообщение будет обрабатываться оконной процедурой окна-адресата после сообщений равного приоритета, которые уже находятся в его очереди. Также следует учитывать, что в момент выполнения операторов, следующих непосредственно за PostMessageC), обработка этого сообщения еще не будет начата.

Различия между SendMessageC) и PostMessageC) можно продемонстрировать на примере обмена сообщениями между приложениями А и Б (папка Message). В примере приложение Б должно послать сообщение приложению А и получить ответ. Для этого приложение Б предварительно должно найти дескриптор окна А.

При отладке подобных задач в интегрированной среде удобно запускать одновременно оба приложения. Для этого необходимо выполнить простую последовательность действий (рис. 2.1):


⇐ Предыдущая| |Следующая ⇒