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則不可能由於消息隊列爲空而進入死循環