PostMessage(HWND hWnd,UINT Msg,WPARAM wParam, LPARAM lParam);
和SendMessage(HWND Wnd,UINT Msg,WPARAM wParam,LPARAM lParam )有什么区别?

解决方案 »

  1.   

    SendMessage要等消息处理完后才能返回,PostMessage将消息放入消息队列后直接返回。
      

  2.   

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

  3.   

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

  4.   

    那么谁能解释一下下面的语句的意思:
    procedure TTsForm.FormKeyPress(Sender: TObject; var Key: Char);
    begin
       if key=#13 then
          begin
          if ActiveControl.ClassName='TDBGridEh' then
            PostMessage(ActiveControl.Handle,WM_KEYDOWN,VK_TAB,0)
          else
            SendMessage(self.Handle,WM_NEXTDLGCTL,0,0);
          KEY:=#0;
        end;
    end;
      

  5.   

    个人感觉PostMessage和SendMessage就像UDP和TCP一样,呵呵
      

  6.   

    如果当前控件是tdbgrideh的话,那么, enter键来执行tab的功能——跳格,如果不是,则把焦点定位到下一个可以接收焦点的控件上,然后,设置key:=空
      

  7.   

    postmessage()只会返回true或者false;
    sendmessage()还会返回其它的信息
      

  8.   

    能不能再解释一下PostMessage(ActiveControl.Handle,WM_KEYDOWN,VK_TAB,0)
    中参数的意思?在帮助中WM_KEYDOWN 被解释为“message to post”是要提交的消息?还是触发此函数的消息? 我想应该解释为后者把,而VK_TAB应解释为执行的操作,对吗?
      

  9.   

    能不能再解释一下PostMessage(ActiveControl.Handle,WM_KEYDOWN,VK_TAB,0)
    中参数的意思?
      

  10.   

    在帮助中WM_KEYDOWN 被解释为“message to post”是要提交的消息
     要提交的消息 发出去的消息还是触发此函数的消息?
    此函数不是被触发的 而是你主动调用的。。
      

  11.   

    PostMessage(ActiveControl.Handle,WM_KEYDOWN,VK_TAB,0)ActiveControl.Handle, // 接收此消息的控件 或者窗口等的句柄
    WM_KEYDOWN,// 发送消息为 WM_KEYDOWN
    VK_TAB, // KeyDown的Key 为 tab键
    0 // 无附加消息 
    注意 最后三个参数的相互关系很强 需要看具体的情况