PostMessage

在与创建指定窗口的线程相关联的消息队列中放置(发布)消息,并返回,而不等待线程处理消息。
要在与线程相关联的消息队列中发布消息,请使用PostThreadMessage函数。

BOOL WINAPI PostMessage(
  _In_opt_ HWND hWnd,
  _In_ UINT Msg,
  _In_ WPARAM wParam,
  _In_ LPARAM lParam
);

参数
hWnd [in,可选]
类型:HWND
窗口程序接收消息的窗口的句柄。以下值具有特殊含义

含义
HWND_BROADCAST ((HWND)0xFFFF)时

该消息被发布到系统中的所有顶级窗口,包括禁用或不可见的未知窗口,重叠窗口和弹出窗口。消息未发布到子窗口。

空值

该函数的行为就像调用PostThreadMessagedwThreadId参数设置为当前线程的标识符。

 

从Windows Vista开始,消息发布受UIPI的约束。进程的线程可以将消息发送到较小或相同完整性级别的进程中的线程的消息队列。

Msg [中]
类型:UINT
要发布的消息。
有关系统提供的消息的列表,请参阅系统定义的消息。

wParam [in]
类型:WPARAM
附加消息特定信息。

lParam [in]
类型: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);



  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值