PostMessage与SendMessage都是用来发送消息,而且都是通过回调函数的形式来对消息进行处理。可是它们的处理方式是不一样的:异步
一、PostMessage是异步处理(非阻塞),它是将消息放到消息队列中,由系统来决定何时调用;SendMessage是同步处理(阻塞),它必须等待消息处理完成返回以后才能进行下一步动做。所以也能够看出,SendMessage的消息是不通过消息队列的;函数
二、函数原型:BOOL PostMessage(WPARAM wp, LPARAM lp) and LRESULT SendMessage(WPARAM wp, LPARAM lp)操作系统
PostMessage返回的是消息发送的成功与否;线程
SendMessage返回的是消息函数处理以后的返回值;队列
三、PreTranslateMessage函数拦截。PreTranslateMessage能够拦截PostMessage发送的消息不能拦截SendMessage发送的消息;进程
一点建议:原型
一、进程之间发送消息最好使用PostMessage;回调函数
二、若是须要频繁的发送一个消息,最好不要使用PostMessage;同步
三、须要频繁的处理一个消息,担忧影响用户体验可使用SendMessageTimeout消息队列
PeekMessage和GetMessage函数的主要区别有:1. GetMessage的主要功能是从消息队列中“取出”消息,消息被取出之后,就从消息队列中将其删除;而PeekMessage的主要功能是“窥视”消息,若是有消息,就返回true,不然返回false。也可使用PeekMessage从消息队列中取出消息,这要用到它的一个参数(UINT wRemoveMsg),若是设置为PM_REMOVE,消息则被取出并从消息队列中删除;若是设置为PM_NOREMOVE,消息就不会从消息队列中取出。2. 若是GetMessage从消息队列中取不到消息,则线程就会被操做系统挂起,等到OS从新调度该线程时,二者的性质不一样:使用GetMessage线程仍会被挂起,使用PeekMessage线程会获得CPU的控制权,运行一段时间。3. GetMessage每次都会等待消息,直到取到消息才返回;而PeekMessage只是查询消息队列,没有消息就当即返回,从返回值判断是否取到了消息。咱们也能够说,PeekMessage是一个具备线程异步行为的函数,无论消息队列中是否有消息,函数都会当即返回。而GetMessage则是一个具备线程同步行为的函数,若是消息队列中没有消息的话,函数就会一直等待,直到消息队列中至少有一条消息时才返回。若是消息队列中没有消息,PeekMessage老是能返回,这就至关于在执行一个循环,若是消息队列一直为空, 它就进入了一个死循环。GetMessage则不可能由于消息队列为空而进入死循环