PostMessage和SeddMessage的区别就是前者马上返回,后者等消息执行完了再返回,但我对消息执行完了这个概念不太清楚!比如:
消息响应函数为A,在A中又调用B,在B中又调用了C,那么SendMessage函数是不是要等B,C都执行完了,最后返回A,再等A执行完了才返回呢?
我有一个线程,它不停的接收数据到自己的缓存,再通信父窗口处理,如果SendMessage函数会像上面那样返回的话,就不用对缓存互斥了,因为实际上他们是顺序执行。

解决方案 »

  1.   

    SendMessage不管A都调用了谁,还是谁也没调用,它只管A结束了就返回。
      

  2.   

    不是你想的。
    那样岂不是PP了
    SendMessage仅仅保证消息发到,不保证消息处理完毕!
    用汇编的观点看,Invoke后马上就执行下一句
      

  3.   

    同一个进程里,SEND MESSAGE的,和接收处理MESSAGE的在同一线程,
    SENDMESSAGE当然要等待消息处理完后才回返回。
      

  4.   

    把SendMessage看成一个普通函数调用,其内部会调用窗口过程
      

  5.   

    Featured(Nanjing.Seu.edu)
    halfdream(哈欠)我试了在同一线程中、同一进程中、不同进程中,效果都如steedhorse(晨星)所说,你们懂吗?前两种情况不用说,下面是我在不同进程中的调试代码:
    HWND hWnd = ::FindWindow(0, "WebClient");
    ::SendMessage(hWnd, WM_APP + 1, 0, 0);
    Beep(1500, 100);在WM_APP + 1消息的处理函数(另个一个应用程序)中加个延时函数Beep,或者干脆弹出一个对话框MessageBox,结果Beep(1500, 100);这条语句都会被延时。
      

  6.   

    另外sendmessage不入消息队列的!
      

  7.   

    zhang_zhibin(blackcat) 解释的极好
      

  8.   

    消息处理函数(A)中调用了其他函数(比如:B)?
    是不是要等B函数也都执行完毕?
    我测试了一下,好像是的哎!测试用例:
    void CSendMessageDlg::OnButton1() 
    {
    SendMessage(WM_COMMAND,IDC_BUTTON2,0);
    MessageBox("Button1");

    }void CSendMessageDlg::OnButton2() 
    {
    OnButton3();              //调用了另外的函数
    MessageBox("Button2");

    }void CSendMessageDlg::OnButton3() 
    {
    MessageBox("Button3");
    }
    最终弹出对话框的顺序是:
     Button3 -> Button2 -> Button1
    楼上各位有何高见?