SendMessage和PostMessage

SendMessage

SendMessage调用相应窗口的“窗口过程”,并且要等“窗口过程”完成了对消息的处理之后才会返回,是同步的。

如果想要发送消息后立即返回,使用SendMessageCallback或SendNotifyMessage。

如果目标窗口时由调用SendMessage的线程创建的,“窗口过程”会被直接调用。

如果目标窗口是由其它线程创建的,系统切换到那个线程,调用对应的“窗口过程”。在不同线程之间发送的消息,只有当接收消息的线程执行了消息检索代码(比如消息循环,也就是消息会被放到接收线程的消息队列)才会被执行。发送消息的线程会被阻塞直到接收消息的线程处理完消息。但是,发送消息的线程在等待消息处理返回的时,可以处理非队列消息,如果想阻止这种处理方式,可以使用SendMessageTimeout并设置SMTO_BLOCK。

PostMessage

把消息放到创建目标窗口的线程的消息队列,然后直接返回,并不等待处理完消息,是异步的。

如果用异步消息函数(PostMessage, SendNotifyMessage, 和 SendMessageCallback)邮递WM_USER值以下的消息,不要在消息参数里使用指针,否则操作会失败,函数会在接收线程有机会处理消息之前返回,并且消息发送方将在它被使用前释放内存。(这里不太懂)

不要用PostMessage邮递WM_QUIT消息,直接用PostQuitMessage。

一个消息队列最多可以容纳10000个消息,一般来说这已经足够了,如果你的应用程序

超过了这个限制,你应该重新设计,避免使用太多系统资源。可以在注册表里改这个限制值,这个值不能低于4000.

HKEY_LOCAL_MACHINE
   SOFTWARE
      Microsoft
         Windows NT
            CurrentVersion
               Windows
                  USERPostMessageLimit

 

参考资料:

https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-sendmessage

https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-postmessagea

posted @ 2019-02-23 21:02  aloog  阅读(305)  评论(0编辑  收藏  举报