对于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,那么可能得到的是延迟一段时候后的图。

 

posted on 2016-01-10 19:24  zooz  阅读(7116)  评论(0编辑  收藏  举报