PostMessage和SendMessage区别

PostMessage和SendMessage区别

PostMessage和SendMessage区别在控制别的应用程序的时候,经常需要等待直到某个功能结束,例如:
打开一个窗口-->等待直到窗口结束
这个时候就可以用到SendMessage
如果在打开这个窗口后仍然需要对该窗口的界面进行设置,比如Edit的value等等,比如:
打开一个窗口-->控制窗口的control的属性
这个时候就需要PostMessage

使用一个钩子程序截获消息后,使用SendMessage把消息发送到主处理程序进行处理,但是在主处理程序还没有完成任务的时候,被设置钩子的程序进入了停止的状态,不可以处理
WM_PAINT,
WM_MOVE,
.......等的基本信息,
必须要等SendMessage发送出的消息完成后,才能继续运行,整个界面一片空白,把钩子消息设置成PostMessage的发送消息形式后,问题解决!
我查了MSDN对这两个API的定义,
PostMessage只是把消息放入队列,不管其他程序是否处理都返回,然后继续执行;
而SendMessage必须等待其他程序处理消息后才返回,继续执行。
PostMessage的返回值表示PostMessage函数执行是否正确;
而SendMessage的返回值表示其他程序处理消息后的返回值。 
使用这两个发送消息函数的最重要的是要看你的程序是否要对消息的滞后性关注否,PostMessage会造成消息的滞后性,而SendMessage则不会,但如果SendMessage消息处理失败,则会造成程序停止! 
 
A君问:PostMessage 和 SendMessage什么区别
B君答:
    PostMessage只负责将消息放到消息队列中,不确定何时及是否处理
    SendMessage要等到受到消息处理的返回码(DWord类型)后才继续
    PostMessage执行后马上返回
    SendMessage必须等到消息被处理后才会返回。
A君:不明白
B君:SendMessage看成ShowModal,PostMessage看成Show
A君:明白

///

参考附件信息:

CWnd::PostMessage

BOOL PostMessage( UINT message, WPARAM wParam = 0, LPARAM lParam =0 );

返回值:如果公布了消息,则返回非零值;否则返回0。

参数: message 指定了要公布的消息。  
wParam 指定了附加的消息信息。这个参数的内容依赖于要公布的消息。  
lParam 指定了附加的消息信息。这个参数的内容依赖于要公布的消息。
 

说明:
这个函数将一个消息放入窗口的消息队列,然后直接返回,并不等待对应的窗口处理消息。消息队列中的消息是通过调用Windows的GetMessage或PeekMessage函数来获得的。
可以通过Windows的PostMessage函数来访问其它应用程序。

请参阅:
::GetMessage, ::PeekMessage, ::PostMessage, ::PostAppMessage, CWnd::SendMessage 

//

CWnd::SendMessage

LRESULT SendMessage( UINT message, WPARAM wParam = 0, LPARAM lParam = 0 );

返回值:消息处理的结果;它的值依赖于发送的消息。

参数: message 指定了要发送的消息。  
wParam 指定了与消息有关的附加信息。  
lParam 指定了与消息有关的附加信息。
 

说明:
这个函数向窗口发送指定的消息。SendMessage成员函数直接调用窗口过程并在窗口过程处理了消息以后才返回。这与PostMessage成员函数形成对比,该函数将消息放入窗口的消息队列并立即返回。

请参阅:
::InSendMessage, CWnd::PostMessage, CWnd::SendDlgItemMessage, ::SendMessage 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值