1、POSTMESSAGE(非阻塞)與SENDMESSAGE(阻塞)
區別1:返回時間不同
PostMessage發送消息后就立即返回
SendMessage發送消息后,等待消息處理函數處理完后才返回。
區別2:返回值不同
從函數定義上來看,PostMessage的返回值是BOOL,
意思是返回非0值,消息執行成功,返回0,執行不成功。
SendMessage的返回值是LRESULT,返回的是消息處理函數后的返回值。
區別3:同步和異步問題
如果發送的消息碼在WM_USER之下(非自定義消息)且消息參數中帶有指針,那么
PostMessage,SendNotifyMessage,SendMessageCallback這些異步消息發送
函數將會失敗。原因是異步消息發送函數發送后會立即返回,這樣會導致消息
處理函數還未處理消息,消息參數中的指針就被釋放了。
區別4:發送中的過程不同
在同一個線程中,PostMessage發送消息時,消息要先放入系統消息隊列中,
系統會根據存放的消息,找到對應的線程(窗口、程序)的消息隊列中,然后由
GetMessage/PeekMessage提交給TranslateMessage,如果是鍵盤、鼠標消息,
TranslateMessage會處理提交給DispatchMessage,如不是,則直接提交給
DispatchMessage,最后DispatchMessage經USER模塊協助,將消息傳遞給窗口
處理函數;而SendMessage發送消息時,由USER模塊調用目標窗口的處理函數
處理消息,並將結果返回。
不在同一個線程,基本都是用PostThreadMessage代替PostMessage,因為
PostThreadMessage是直接指定線程ID來確定目標線程;而SendMessage發送
消息到目標窗口所屬的線程的消息隊列中,然后發送消息的線程在UESR模塊內
監視和等待消息處理,直到目標窗口處理完返回。