Функция PostMessageW (winuser.h)
Помещает (публикует) сообщение в очереди сообщений, связанной с потоком, создающим указанное окно, и возвращается без ожидания обработки сообщения.
Чтобы опубликовать сообщение в очереди сообщений, связанной с потоком, используйте функцию PostThreadMessage.
Синтаксис
BOOL PostMessageW(
[in, optional] HWND hWnd,
[in] UINT Msg,
[in] WPARAM wParam,
[in] LPARAM lParam
);
Параметры
[in, optional] hWnd
Тип: HWND
Дескриптор окна, процедура которого состоит в получении сообщения. Следующие значения имеют особые значения.
Начиная с 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), его параметры сообщения не могут включать указатели. В противном случае операция завершится ошибкой. Функции будут возвращены, прежде чем получающий поток имел возможность обработать сообщение, и отправитель освободит память до его использования.
Не публиковать сообщение
Приложение специальных возможностей может использовать 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) |
См. также
концептуальные
сообщений и очередей сообщений
Справочник