Функция PostThreadMessage помещает сообщение в очередь сообщений заданного потока. Она возвращает значение без ожидания обработки сообщения потоком.
Синтаксис
BOOL PostThreadMessage( DWORD idThread, UINT Msg, WPARAM wParam, LPARAM lParam ); |
Параметры
idThread
[in] Идентификатор потока, в очередь которого помещено сообщение.
Функция завершается ошибкой, если заданный поток не имеет очереди сообщений. Система создает очередь сообщений потока, когда поток делает свой первый вызов одной из функций модулей USER или GDI. Для получения дополнительной информации, см. раздел Замечаний.
Windows 2000/XP: Этот поток должен или принадлежать тому же самому рабочему столу, что и вызывающий поток, или процессу с тем же самым локальным уникальным идентификатором (LUID). В противном случае функция завершается ошибкой и возвращает значение ERROR_INVALID_THREAD_ID.
Msg
[in] Устанавливает тип сообщения, которое будет помещено в очередь.wParam
[in] Определяет дополнительную конкретизирующую сообщение информацию.lParam
[in] Определяет дополнительную конкретизирующую сообщение информацию.Возвращаемые значения
Если функция завершается успешно, величина возвращаемого значения - не нуль.
Если функция завершилась ошибкой, величина возвращаемого значения нулевая. Чтобы получить дополнительные данные об ошибке, вызовите GetLastError. GetLastError возвращает значение ERROR_INVALID_THREAD_ID, если в параметре idThread - не допустимый идентификатор потока, или если поток, заданный idThread не имеет очереди сообщений.
ЗамечанияПоток, в очередь которого помещается сообщение, должен иметь созданную очередь сообщений, иначе вызов к PostThreadMessage завершится ошибкой. Используйте один из следующих методов обработки этой ситуации:
PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE) |
Поток, в очередь которого помещается сообщение, извлекает его путем вызова функции GetMessage или PeekMessage. Член hwnd возвращенной структуры MSG имеет значение ПУСТО (NULL).Установите событие, чтобы указать, что поток готов принять помещаемые в очередь сообщения.
Сообщения, отправленные PostThreadMessage не связаны с окном. Сообщения, которые не связаны с окном, не могут быть распределены функцией DispatchMessage. Поэтому, если поток получателя находится в модальном цикле (как используется функция MessageBox или DialogBox), сообщения, будет потеряно. Чтобы перехватывать сообщения потока в то время как он в модальном цикле, используйте определяемую потоком hook -процедуру - ловушку события.
Система совершает сортировку только системных сообщений (которые в диапазоне от 0 до WM_USER). Чтобы отправлять другие сообщения (которые значением выше WM_USER) другому процессу, Вы должны сделать специальную сортировку (маршалинг).
Windows 2000/XP: Имеется ограничение в размере 10,000 помещенных в очередь (синхронных) сообщений в очередь сообщений. Это ограничение должно быть достаточно большим. Если ваше приложение выходит за пределы ограничения, оно должно быть переделано, чтобы избежать потреблять так много системных ресурсов. Чтобы регулировать это ограничение, измените нижеследующий ключ системного реестра:
HKEY_LOCAL_MACHINE
|
Минимальное приемлемое значение - 4000.
Windows 95/98/Me: PostThreadMessageW поддерживается подпрограммой Microsoft Layer for Unicode (MSLU). Чтобы использовать подпрограмму, Вы должны добавить некоторые файлы к вашему приложению, как это определено в Microsoft Layer for Unicode для систем Windows 95/98/Me.
Смотри также
Обзор Сообщения и очереди сообщений, GetCurrentThreadId, GetMessage, GetWindowThreadProcessId, MSG, PeekMessage, PostMessage, Sleep, WaitForSingleObject
Размещение и совместимость PostThreadMessage |
|
Windows. NET Server |
Да |
Windows XP |
Да |
Windows 2000 |
Да |
Windows NT |
Да версии 3.1 и выше |
Windows Me |
Да |
Windows 98 |
Да |
Windows 95 |
Да |
Используемая библиотека |
User32.lib |
Заголовочный файл |
|
- объявлено в |
Winuser.h |
- включено в |
Windows.h |
Unicode |
Нет |
Замечания по платформе |
Не имеется |