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


Функция 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)

  • Задайте событие, чтобы указать, что поток готов к получению опубликованных сообщений.
Поток, в который отправляется сообщение, извлекает сообщение, вызвав функцию GetMessage или PeekMessage. Элемент возвращаемой структуры MS G имеет значение NULL .

Сообщения, опубликованные 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)

См. также

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

GetCurrentThreadId

GetMessage

GetWindowThreadProcessId

MSG

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

другие ресурсы

PeekMessage

PostMessage

Справочник

спящего

WaitForSingleObject