Поделиться через


Функция SendMessage (winuser.h)

Отправляет указанное сообщение в окно или окна. Функция SendMessage вызывает процедуру окна для указанного окна и не возвращается, пока эта процедура не обработает сообщение.

Чтобы отправить сообщение и немедленно вернуться, используйте функцию SendMessageCallback или SendNotifyMessage . Чтобы отправить сообщение в очередь сообщений потока и немедленно вернуться, используйте функцию PostMessage или PostThreadMessage .

Синтаксис

LRESULT SendMessage(
  [in] HWND   hWnd,
  [in] UINT   Msg,
  [in] WPARAM wParam,
  [in] LPARAM lParam
);

Параметры

[in] hWnd

Тип: HWND

Дескриптор для окна, оконная процедура которого получит сообщение. Если этот параметр имеет значение HWND_BROADCAST ((HWND)0xffff), сообщение отправляется во все окна верхнего уровня в системе, включая отключенные или невидимые окна без владельца, перекрывающиеся окна и всплывающие окна; но сообщение не отправляется в дочерние окна.

Отправка сообщений регулируется UIPI. Поток процесса может отправлять сообщения только в очереди сообщений потоков в процессах с меньшим или равным уровнем целостности.

[in] Msg

Тип: UINT

Отправляемое сообщение.

Списки системных сообщений см. в разделе Системные сообщения.

[in] wParam

Тип: WPARAM

Дополнительные сведения, относящиеся к сообщению.

[in] lParam

Тип: LPARAM

Дополнительные сведения, относящиеся к сообщению.

Возвращаемое значение

Тип: LRESULT

Возвращаемое значение указывает результат обработки сообщения; это зависит от отправленного сообщения.

Комментарии

Если сообщение блокируется UIPI, последняя ошибка, полученная с помощью GetLastError, имеет значение 5 (доступ запрещен).

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

Система выполняет маршалинг только для системных сообщений (в диапазоне от 0 до (WM_USER–1)). Чтобы отправить другие сообщения (т. е>. WM_USER) в другой процесс, необходимо выполнить настраиваемое маршалирование.

Если указанное окно было создано вызывающим потоком, процедура окна вызывается немедленно в качестве подпрограммы. Если указанное окно было создано другим потоком, система переключается на этот поток и вызывает соответствующую процедуру окна. Сообщения, отправляемые между потоками, обрабатываются только в том случае, если принимающий поток выполняет код получения сообщения. Отправляя поток блокируется до тех пор, пока принимающий поток не обработает сообщение. Однако поток отправки будет обрабатывать входящие сообщения без очереди, ожидая обработки своего сообщения. Чтобы избежать этого, используйте SendMessageTimeout с параметром SMTO_BLOCK. Дополнительные сведения о сообщениях без очереди см. в разделе Сообщения без очереди.

Приложение со специальными возможностями может использовать SendMessage для отправки WM_APPCOMMAND сообщений в оболочку для запуска приложений. Эта функция не гарантируется для других типов приложений.

Примеры

Пример см. в разделе Отображение ввода с клавиатуры.

Требования

Требование Значение
Минимальная версия клиента Windows 2000 Professional [только классические приложения]
Минимальная версия сервера Windows 2000 Server [только классические приложения]
Целевая платформа Windows
Header winuser.h (включая Windows.h)
Библиотека User32.lib
DLL User32.dll
Набор API ext-ms-win-ntuser-message-l1-1-0 (появилось в Windows 8)

См. также раздел

Основные понятия

InSendMessage

Сообщения и очереди сообщений

PostMessage

PostThreadMessage

Справочные материалы

RegisterWindowMessage

SendDlgItemMessage

SendMessageCallback

SendMessageTimeout

SendNotifyMessage