在与创建指定窗口的线程相关联的消息队列中放置(发布)消息,并返回,而不等待线程处理消息。
要在与线程相关联的消息队列中发布消息,请使用PostThreadMessage函数。
BOOL WINAPI PostMessage(
_In_opt_ HWND hWnd,
_In_ UINT Msg,
_In_ WPARAM wParam,
_In_ LPARAM lParam
);
参数
hWnd [in,可选]
类型:HWND
窗口程序接收消息的窗口的句柄。以下值具有特殊含义
值 | 含义 |
---|---|
| 该消息被发布到系统中的所有顶级窗口,包括禁用或不可见的未知窗口,重叠窗口和弹出窗口。消息未发布到子窗口。 |
| 该函数的行为就像调用PostThreadMessage,dwThreadId参数设置为当前线程的标识符。 |
Msg [中]
类型:UINT
要发布的消息。
有关系统提供的消息的列表,请参阅系统定义的消息。
类型:WPARAM
附加消息特定信息。
类型:LPARAM
附加消息特定信息。
返回值
类型:BOOL
如果函数成功,返回值不为零。
如果函数失败,返回值为零。要获取扩展错误信息,请调用GetLastError。当命中限制时,GetLastError返回ERROR_NOT_ENOUGH_QUOTA。
备注
当UIPI阻止消息时,使用GetLastError检索的最后一个错误设置为5(访问被拒绝)。
通过调用GetMessage或PeekMessage函数来检索消息队列中的消息。
需要使用HWND_BROADCAST进行通信的应用程序应使用RegisterWindowMessage函数来获取应用程序间通信的唯一消息。
系统只对系统消息进行编组(范围为0到(WM_USER -1))。要发送其他消息(那些> = WM_USER)到另一个进程,你必须做自定义编组。
如果您在WM_USER下面的消息发送到异步消息功能(PostMessage,SendNotifyMessage和SendMessageCallback),则其消息参数不能包含指针。否则,操作将失败。在接收线程有机会处理消息之前,函数将返回,并且发送器在使用之前将释放内存。
不要使用PostMessage发布WM_QUIT消息; 使用PostQuitMessage函数。
可访问性应用程序可以使用PostMessage将WM_APPCOMMAND消息发布到shell以启动应用程序。此功能不能保证适用于其他类型的应用程序。
每个邮件队列的发送邮件数量有限10万条。这个限制应该足够大。如果您的应用程序超出限制,则应重新设计,以避免消耗如此多的系统资源。要调整此限制,请修改以下注册表项。
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);