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


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

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

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

Синтаксис

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

Параметры

[in, optional] hWnd

Тип: HWND

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

Значение Значение
HWND_BROADCAST
((HWND)0xffff)
Сообщение публикуется во всех окнах верхнего уровня в системе, включая отключенные или невидимые окна, перекрывающиеся окна и всплывающие окна. Сообщение не публикуется в дочерние окна.
NULL
Функция ведет себя как вызов PostThreadMessage с параметром dwThreadId , заданным для идентификатора текущего потока.
 

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

[in] Msg

Тип: UINT

Сообщение для публикации.

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

[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 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)

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

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

GetMessage

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

PeekMessage

PostQuitMessage

PostThreadMessage

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

RegisterWindowMessage

SendMessageCallback

SendNotifyMessage