SendMessage 和 PostMessage的区别

本文探讨了PostMessage与SendMessage在Windows API中的不同之处,包括返回时间、返回值、同步异步处理、发送过程及线程管理。PostMessage为非阻塞异步,返回BOOL;而SendMessage则阻塞等待响应。了解它们在多线程和自定义消息中的行为至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、返回时间不同

  • PostMessage发送消息后就立即返回 (非阻塞)
  • SendMessage发送消息后,等待消息处理函数处理完后才返回 (阻塞)

2、返回值不同

  • PostMessage的返回值是BOOL,返回非0则消息执行成功,返回0则消息执行不成。
  • SendMessage的返回值是LRESULT,返回的是消息处理函数后的返回值

4、同步和异步问题

如果发送的消息码在WM_USER之下(非自定义消息)且消息参数中带有指针,那么PostMessage,SendNotifyMessage,SendMessageCallback这些异步消息发送函数将会失败,原因是异步消息发送函数发送后会立即返回,这样会导致消息处理函数还未处理消息,消息参数中的指针就被释放了

5、发送中的过程不同

在同一个线程中,PostMessage发送消息时,消息要先放入系统消息队列中,系统会根据存放的消息,找到对应的线程

(窗口、程序)的消息队列中,然后由GetMessage/PeekMessage提交给TranslateMessage,如果是键盘、鼠标消息,TranslateMessage会处理提交给DispatchMessage经USER模块协助,将消息传递给窗口处理函数;而SendMessage发送消息时,由USER模块调用目标窗口的处理函数处理消息,并将结果返回。不在同一个线程,基本都是用PostThreadMessage代替PostMessage,因为PostThreadMessage是直接指定线程ID来确定目标线程;而SendMessage发送消息到目标窗口所属的线程的消息队列中,然后发送消息的线程在UESR模块内1、监视和等待消息处理,直到目标窗口处理完返回。

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值