函数功能:
PostThreadMessage 函数将一个消息放入指定线程的消息队列中,并且不等待线程处理消息就立即返回。
API 函数原型:
BOOL WINAPI PostThreadMessage( _In_ DWORD idThread, _In_ UINT Msg, _In_ WPARAM wParam, _In_ LPARAM lParam );
参数解析:
|
参数 |
含义 |
|
idThread |
1. 指定接收消息的线程的标识符 |
|
Msg |
1. 指定将被发送的消息 |
|
wParam |
消息的附加信息 |
|
lParam |
消息的附加信息 |
返回值:
1. 如果该函数调用成功,返回值是非 0;
2. 如果该函数调用失败,返回值是 0(如果调用 GetLastError 函数的返回值是 ERROR_INVALID_THREAD_ID,说明 idThread 参数不是一个合法的线程标识符,或者 idThread 参数指定的线程不具有消息队列;如果调用 GetLastError 函数的返回值是 ERROR_NOT_ENOUGH_QUOTA,则说明投递消息超出限制)。
备注:
1. 当消息被 UIPI 所阻断,调用 GetLastError 函数可以获得错误代码是 5(拒绝访问)。
2. 接收消息的线程必须创建一个消息队列,否则 PostThreadMessage 函数调用失败。
遇到这个问题,请使用下边方法解决:
- 创建一个事件对象,然后创建线程。
- 在调用 PostThreadMessage 函数前,使用 WaitForSingleObject 函数等待事件被设置为有信号状态。
- 在发送消息的线程中,调用 PeekMessage 函数(PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE))来强制系统创建消息队列。
- 设置事件,表示线程已准备好接收寄送的消息。
3. 从消息队列中获取消息,请使用 GetMessage 或 PeekMessage 函数。MSG 结构的 hwnd 成员应该是 NULL。
4. PostThreadMessage 发送的消息并不与窗口相关联。就一般规则而言,不与窗口相关联的消息不能通过 DispatchMessage 函数分派。因此,如果接收消息的线程在模式循环中(例如 MessageBox 或 DialogBox),消息将可能丢失。应该使用线程钩子在模式循环下拦截线程消息。
5. 系统只对系统级的消息(0 ~ WM_USER-1)进行封送处理。发送自定义消息(>= WM_USER)到另一个进程,你需要自己对消息进行封送处理。
6. 每个消息队列限制可以放入 10,000 个消息。这个限制应该是足够大的,如果你的应用程序超过限制,那么它应该重新设计以避免消耗太多的系统资源。不过修改下边注册表项,可以调整这个限制:
| HKEY_LOCAL_MACHINE
| -- SOFTWARE
| -- -- Microsoft
| -- -- -- Windows NT
| -- -- -- -- CurrentVersion
| -- -- -- -- -- Windows
| -- -- -- -- -- -- USERPostMessageLimit
注:可调节的最小值是 4000。




