Delphi SendMessage PostMessage 原理和区别

今天用实例解释一下SendMessage PostMessage 原理和区别:

向按钮(Button)发送单击:

SendMessage:

  SendMessage(Button1.Handle, WM_LBUTTONDOWN, 0, 0);
  SendMessage(Button1.Handle, WM_LBUTTONUP, 0, 0);

PostMessage:

  PostMessage(Button1.Handle, WM_LBUTTONDOWN, 0, 0);
  PostMessage(Button1.Handle, WM_LBUTTONUP, 0, 0);

这2者都可以

但是向Edit发送字符串SendMessage可以,PostMessage就不行

  Str := 'ABC';

  PostMessage(Edit1.Handle, WM_SETTEXT, 0, LPARAM(str)); //不行

  SendMessage(Edit1.Handle, WM_SETTEXT, 0, LPARAM(str)); //行


在MSDN中,SendMessage解释如为:The SendMessage function sends the specified message to a window or windows. It calls the window procedure for the specified

window and does not return until the window procedure has processed the message.
翻译成中文为:SendMessage函数将指定的消息发到窗口。它调用特定窗口的窗口处理函数,并且不会立即返回,直到窗口处理函数处理了这个消息。
再看看PostMessage的解释:The PostMessage function places (posts) a message in the message queue associated with the thread that created the specified window

and returns without waiting for the thread to process the message.
    翻译成中文为:PostMessage函数将一个消息放入与创建这个窗口的消息队列相关的线程中,并立刻返回不等待线程处理消息。
仔细看完MSDN解释,我们了解到,SendMessage的确是发送消息,然后等待处理完成返回,但发送消息的方法为直接调用消息处理函数(即WndProc函数),按照函数调用规则,肯定会等消息处理函数返回之后,SendMessage才返回。而PostMessage却没有发送消息,PostMessage是将消息放入消息队列中,然后立刻返回,至于消息何时被处理,PostMessage完全不知道,此时只有消息循环知道被PostMessage的消息何时被处理了。


至此简单理解为:

SendMessage可以理解为,SendMessage函数发送消息,等待消息处理完成后,SendMessage才返回。稍微深入一点,是等待窗口处理函数返回后,SendMessage就返回了。
PostMessage可以理解为,PostMessage函数发送消息,不等待消息处理完成,立刻返回。稍微深入一点,PostMessage只管发送消息,消息有没有被送到则并不关心,只要发送了消息,便立刻返回。



阅读更多
换一批

没有更多推荐了,返回首页