函数功能:
PostMessage 函数将一个消息放入(posts)与指定窗口相关联的线程的消息队列中,并且不等待线程处理消息就立即返回。
如果要将消息放入与线程相关联的消息队列,请使用 PostThreadMessage 函数。
API 函数原型:
BOOL WINAPI PostMessage( _In_opt_ HWND hWnd, _In_ UINT Msg, _In_ WPARAM wParam, _In_ LPARAM lParam );
参数解析:
|
参数 |
含义 |
|
hWnd |
1. 指定接收消息的窗口过程的窗口句柄 |
|
Msg |
1. 指定将被发送的消息 |
|
wParam |
消息的附加信息 |
|
lParam |
消息的附加信息 |
返回值:
1. 如果函数调用成功,返回值是非 0;
2. 如果函数调用失败,返回值是 0(调用 GetLastError 函数的返回值是 ERROR_NOT_ENOUGH_QUOTA,则说明投递消息超出限制)。
备注:
1. 当消息被 UIPI 所阻断,调用 GetLastError 函数可以获得错误代码是 5(拒绝访问)。
2. 从消息队列中获取消息,请使用 GetMessage 或 PeekMessage 函数。
3. 对于需要使用 HWND_BROADCAST 通信的应用程序,应当调用 RegisterWindowMessage 函数来为应用程序间的通信取得一个唯一的消息。
4. 系统只对系统级的消息(0 ~ WM_USER-1)进行封送处理。发送自定义消息(>= WM_USER)到另一个进程,你需要自己对消息进行封送处理。
5. 如果发送一个范围低于 WM_USER 的消息给异步消息函数(PostMessage、 SendNotifyMessage 或 SendMessageCallback),它的消息参数不能包含指针。否则,操作将失败。函数将在接收线程处理消息之前返回,发送者将在内存被使用之前释放。
6. 请不要使用 PostMessage 函数投递 WM_QUIT 消息;应该使用 PostQuitMessage 函数代替。
7. 每个消息队列限制可以放入 10,000 个消息。这个限制应该是足够大的,如果你的应用程序超过限制,那么它应该重新设计以避免消耗太多的系统资源。不过修改下边注册表项,可以调整这个限制:
| HKEY_LOCAL_MACHINE
| -- SOFTWARE
| -- -- Microsoft
| -- -- -- Windows NT
| -- -- -- -- CurrentVersion
| -- -- -- -- -- Windows
| -- -- -- -- -- -- USERPostMessageLimit
注:可调节的最小值是 4000。
举例:
下边例子展示如何使用 PostMessage 函数投递窗口自定义消息。
假设自定义的消息叫做 WM_COMPLETE:
#define WM_COMPLETE (WM_USER + 0)
你可以将消息投递到与指定窗口相关联的线程的消息队列中,代码如下:
WaitForSingleObject (pparams->hEvent, INFINITE) ; lTime = GetCurrentTime () ; PostMessage (pparams->hwnd, WM_COMPLETE, 0, lTime);




