Размещение и отправка сообщений

Любое приложение может отправлять и отправлять сообщения. Как система приложение посылает сообщение, скопировав его в очередь сообщений и отправляет сообщение путем передачи сообщения данных в качестве аргументов процедуре окна. Чтобы отправлять сообщения, приложение использует функцию PostMessage . Приложение может отправить сообщение, вызвав SendMessage, BroadcastSystemMessage, SendMessageCallback, SendMessageTimeout, SendNotifyMessageили SendDlgItemMessage функции.

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

Приложение обычно посылает сообщение для уведомления процедуру окна для выполнения задачи, немедленно. Функция SendMessage отправляет сообщение процедуре окна, соответствующего в данном окне. Функция ожидает до тех пор, пока процедура окна завершает обработку и возвращает результат сообщения. Родитель и ребенок windows часто общаются, отправляя сообщения друг другу. К примеру родительского окна, который имеет элемент управления edit, как его дочернего окна можно задать текст элемента управления, отправив сообщение на него. Элемент управления может уведомлять родительское окно изменения к тексту, которые осуществляется пользователем путем отправки сообщений обратно в родительский.

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

Иногда может потребоваться отправить или опубликовать сообщение всем окнам верхнего уровня в системе. Например, если приложение изменяет системное время, оно должно уведомить всех окон верхнего уровня об изменении, отправив WM_TIMECHANGE сообщение. Приложение может отправлять или отправить сообщение всем окнам верхнего уровня путем вызова функции SendMessage или PostMessage и указав HWND_TOPMOST в параметре hwnd . Вы также можете передать сообщение для всех приложений путем вызова функции BroadcastSystemMessage и указания BSM_APPLICATIONS в параметре lpdwRecipients.

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

С помощью функции InSendMessage или InSendMessageEx , процедуре окна можно определить, обрабатывает ли он сообщение, отправленное другим потоком. Эта возможность полезна, когда обработка сообщений зависит от происхождения сообщения.

Общая ошибка программирования — предположить, что функцией PostMessage всегда посылает сообщение. Это не так, когда в очередь сообщений заполнена. Приложение должно проверить значение, возвращаемое функцией PostMessage для определения ли сгенерировано сообщение и, если он не имеет, repost его.

Index