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


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

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

Синтаксис

BOOL PostThreadMessageA(
  [in] DWORD  idThread,
  [in] UINT   Msg,
  [in] WPARAM wParam,
  [in] LPARAM lParam
);

Параметры

[in] idThread

Тип: DWORD

Идентификатор потока, в который должно быть отправлено сообщение.

Функция завершается ошибкой, если в указанном потоке нет очереди сообщений. Система создает очередь сообщений потока, когда поток выполняет свой первый вызов одной из функций User или 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 , чтобы дождаться, пока событие будет установлено в состояние сигнала перед вызовом PostThreadMessage.
  • В потоке, в который будет отправлено сообщение, вызовите PeekMessage , как показано здесь, чтобы заставить систему создать очередь сообщений.

    PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE)

  • Задайте событие , чтобы указать, что поток готов к приему опубликованных сообщений.
Поток, в который отправляется сообщение, извлекает сообщение, вызывая функцию GetMessage или PeekMessage . Элемент hwnd возвращаемой структуры MSG имеет значение 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 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)

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

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

GetCurrentThreadId

GetMessage

GetWindowThreadProcessId

MSG

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

Другие ресурсы

PeekMessage

PostMessage

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

Sleep

WaitForSingleObject