对于SendMessage 和 PostMessage 平时口头的解释是
SendMessage 发送消息后等待返回,
PostMessage 发送消息后立即返回 。
但是这样解释还是不具体,什么叫等待 什么叫立即?
下面的代码可以解释,SendMessage 必须要等到消息响应函数结束,才继续执行。
#define USER_MSG WM_USER+1 /*使用SendMessage的例子 程序执行的步骤 */ void fun() { // 第一步 SendMessage(hWnd,USER_MSG); // 第三步 return; } void OnUserMesssage() { // 第二步 do sth; }
/*使用PostMessage*/ #define USER_MSG WM_USER+1 void fun() { //第一步 PostMessage(hwnd,USER_MSG) ; //第二步 return; } //不知道是第几步,等待消息队列轮到USER_MSG消息被捕获。 void OnUserMsg() { //等待窗口的后台消息处理过程通过GetMessage 取出了消息之后,再执行。 }
那么为什么要有这样的区分?
场景1,在OnCreate 消息中,获取子窗口的位置。
因为窗体以及其子窗口在OnCreate的时候还没有创建完成,(收到了一个WM_CREATE消息)
此时,获取子窗口的的位置是不可靠的。所以,可以在OnCreate 处理函数中,
向窗口以PostMessage发送一个自定义消息,等自定义消息响应时,OnCreate已经完成了。在自定义消息中获取到子窗口的准确位置。
场景2,使用采集卡的例子中,当用户发送采集信息,主程序需要得到一个图片之后才继续执行。那么就可以用SendMessage 来通知采集卡采图。
如果用PostMessage,那么可能得到的是延迟一段时候后的图。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步