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


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

Помещает (публикует) сообщение в очереди сообщений, связанной с потоком, создающим указанное окно, и возвращается без ожидания обработки сообщения.

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

Синтаксис

BOOL PostMessageW(
  [in, optional] HWND   hWnd,
  [in]           UINT   Msg,
  [in]           WPARAM wParam,
  [in]           LPARAM lParam
);

Параметры

[in, optional] hWnd

Тип: HWND

Дескриптор окна, процедура которого состоит в получении сообщения. Следующие значения имеют особые значения.

Ценность Значение
HWND_BROADCAST
((HWND)0xffff)
Сообщение публикуется во всех окнах верхнего уровня в системе, включая отключенные или невидимые невидимые несовершенные окна, перекрывающиеся окна и всплывающие окна. Сообщение не публикуется в дочерних окнах.
НЕДЕЙСТВИТЕЛЬНЫЙ
Функция ведет себя как вызов PostThreadMessage с параметром dwThreadId , заданным для идентификатора текущего потока.
 

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

[in] Msg

Тип: UINT

Сообщение, которое будет опубликовано.

Списки системных сообщений см. в System-Defined сообщениях.

[in] wParam

Тип: WPARAM

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

[in] lParam

Тип: LPARAM

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

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

Тип: BOOL

Если функция выполнена успешно, возвращаемое значение ненулевое.

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

Замечания

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

Сообщения в очереди сообщений извлекаются вызовами функции GetMessage или PeekMessage.

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

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

Если вы отправляете сообщение в диапазоне ниже WM_USER в асинхронные функции сообщений (PostMessage, SendNotifyMessageи SendMessageCallback), его параметры сообщения не могут включать указатели. В противном случае операция завершится ошибкой. Функции будут возвращены, прежде чем получающий поток имел возможность обработать сообщение, и отправитель освободит память до его использования.

Не публиковать сообщение WM_QUIT с помощью PostMessage; используйте функцию PostQuitMessage .

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

Существует ограничение в 10 000 опубликованных сообщений в очереди сообщений. Это ограничение должно быть достаточно большим. Если приложение превышает ограничение, его следует изменить, чтобы избежать использования так много системных ресурсов. Чтобы изменить это ограничение, измените следующий раздел реестра.

HKEY_LOCAL_MACHINE
   SOFTWARE
      Microsoft
         Windows NT
            CurrentVersion
               Windows
                  USERPostMessageLimit

Если функция завершается ошибкой, вызовите GetLastError, чтобы получить расширенные сведения об ошибке. GetLastError возвращает ERROR_NOT_ENOUGH_QUOTA при достижении предела.

Минимально допустимое значение равно 4000.

Примеры

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

#define        WM_COMPLETE     (WM_USER + 0)

Вы можете опубликовать сообщение в очередь сообщений, связанную с потоком, который создал указанное окно, как показано ниже:

 WaitForSingleObject (pparams->hEvent, INFINITE) ;
 lTime = GetCurrentTime () ;
 PostMessage (pparams->hwnd, WM_COMPLETE, 0, lTime);

Дополнительные примеры см. в инициированииканала данных.

Заметка

Заголовок winuser.h определяет PostMessage как псевдоним, который автоматически выбирает версию ANSI или Юникод этой функции на основе определения константы препроцессора ЮНИКОДа. Сочетание использования псевдонима, нейтрального для кодирования, с кодом, не зависящим от кодирования, может привести к несоответствиям, которые приводят к ошибкам компиляции или среды выполнения. Дополнительные сведения см. в соглашениях о прототипах функций.

Требования

Требование Ценность
минимальные поддерживаемые клиентские Windows 2000 Профессиональный [только классические приложения]
минимальный поддерживаемый сервер Windows 2000 Server [только классические приложения]
целевая платформа Виндоус
заголовка winuser.h (включая Windows.h)
библиотеки User32.lib
DLL User32.dll
набор API ext-ms-win-ntuser-message-l1-1-0 (представлено в Windows 8)

См. также

концептуальные

GetMessage

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

PeekMessage

PostQuitMessage

PostThreadMessage

Справочник

RegisterWindowMessage

SendMessageCallback

SendNotifyMessage