Функция PostThreadMessageW (winuser.h)
Отправляет сообщение в очередь сообщений указанного потока. Он возвращается без ожидания обработки сообщения потоком.
Синтаксис
BOOL PostThreadMessageW(
[in] DWORD idThread,
[in] UINT Msg,
[in] WPARAM wParam,
[in] LPARAM lParam
);
Параметры
[in] idThread
Тип: DWORD
Идентификатор потока, в который будет отправлено сообщение.
Функция завершается ошибкой, если указанный поток не имеет очереди сообщений. Система создает очередь сообщений потока при первом вызове одной из функций Пользователя или GDI. Дополнительные сведения см. в разделе "Примечания".
Публикация сообщений распространяется на UIPI. Поток процесса может отправлять сообщения только в очереди сообщений, размещенных в потоках в процессах меньшего или равного уровня целостности.
Этот поток должен иметь права SE_TCB_NAME для публикации сообщения в поток, который принадлежит процессу с тем же локальным уникальным идентификатором (LUID), но находится на другом рабочем столе. В противном случае функция завершается ошибкой и возвращает ERROR_INVALID_THREAD_ID.
Этот поток должен принадлежать к тому же рабочему столу, что и вызывающий поток, или к процессу с тем же LUID. В противном случае функция завершается ошибкой и возвращает ERROR_INVALID_THREAD_ID.
[in] Msg
Тип: UINT
Тип сообщения для публикации.
[in] wParam
Тип: WPARAM
Дополнительные сведения о сообщении.
[in] lParam
Тип: LPARAM
Дополнительные сведения о сообщении.
Возвращаемое значение
Тип: BOOL
Если функция выполнена успешно, возвращаемое значение ненулевое.
Если функция завершается ошибкой, возвращаемое значение равно нулю. Чтобы получить расширенные сведения об ошибке, вызовите GetLastError. GetLastError возвращает ERROR_INVALID_THREAD_ID, если idThread не является допустимым идентификатором потока или если поток, указанный idThread, не имеет очереди сообщений. GetLastError возвращает ERROR_NOT_ENOUGH_QUOTA при достижении предела сообщения.
Замечания
Если сообщение блокируется UIPI последней ошибкой, полученной с помощью GetLastError, имеет значение 5 (доступ запрещен).
Поток, в который отправляется сообщение, должен быть создан очередь сообщений или вызов PostThreadMessage завершается ошибкой. Используйте следующий метод для обработки этой ситуации.
- Создайте объект события, а затем создайте поток.
-
Используйте функцию waitforSingleObject
WaitForSingleObject, чтобы ожидать, пока событие будет установлено в сигнальное состояние перед вызовом PostThreadMessage . -
В потоке, в котором будет размещено сообщение, вызовите PeekMessage, как показано здесь, чтобы принудительно создать очередь сообщений системой.
PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE)
- Задайте событие, чтобы указать, что поток готов к получению опубликованных сообщений.
Сообщения, опубликованные PostThreadMessage, не связаны с окном. Как правило, сообщения, не связанные с окном, не могут быть отправлены функцией DispatchMessage. Таким образом, если поток получателя находится в модальном цикле (как используется MessageBox или DialogBox), сообщения будут потеряны. Чтобы перехватывать сообщения потоков во время модального цикла, используйте перехватчик для конкретного потока.
Система выполняет маршаллинг только для системных сообщений (в диапазоне от 0 до (WM_USER–1)). Чтобы отправить другие сообщения (те >= WM_USER) в другой процесс, необходимо выполнить настраиваемую маршалинг.
Существует ограничение в 10 000 опубликованных сообщений в очереди сообщений. Это ограничение должно быть достаточно большим. Если приложение превышает ограничение, его следует изменить, чтобы избежать использования так много системных ресурсов. Чтобы изменить это ограничение, измените следующий раздел реестра.
HKEY_LOCAL_MACHINE SOFTWARE Microsoft Windows NT CurrentVersion Windows USERPostMessageLimit
Минимально допустимое значение равно 4000.
Заметка
Заголовок winuser.h определяет PostThreadMessage как псевдоним, который автоматически выбирает версию 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) |
См. также
концептуальные
сообщений и очередей сообщений
другие ресурсы
Справочник