PostMessage與SendMessage區別

CodeAgriculture發表於2013-03-27
1、返回值意義的區別,先看一下 MSDN 裡的宣告:
LRESULT SendMessage(
        HWND hWnd,
        UINT Msg,
        WPARAM wParam,
        LPARAM lParam
);
BOOL PostMessage(
        HWND hWnd,
        UINT Msg,
        WPARAM wParam,
        LPARAM lParam
);
  其 4 個引數的意義是一樣的,返回值型別不同。PostMessage的返回值(BOOL)表示PostMessage函式執行是否正確,SendMessage的返回值(LRESULT )表示其他程式處理訊息後的返回值。

2、PostMessage 是非同步的,SendMessage 是同步的。
  PostMessage 只把訊息放入佇列,不管訊息是否被處理就返回,訊息可能不被處理;而 SendMessage 等待訊息被處理完了之後才返回,如果訊息不被處理,傳送訊息的執行緒將一直被阻塞。

3、 當一個執行緒向該執行緒所建立的視窗SendMessage訊息時,由 USER32.DLL 模組呼叫目標視窗的訊息處理程式,並將結果返回,它只是呼叫指定視窗的訊息處理過程,並不將訊息入佇列。當一個執行緒向另一個執行緒所建立的視窗 SendMessage時,該訊息要追加到接收訊息執行緒的傳送訊息佇列,然後傳送訊息的執行緒進入等待狀態,接收訊息的執行緒處理完該訊息後,由系統喚醒傳送 訊息的執行緒,這時傳送執行緒繼續進行。PostMessage 傳送訊息時,訊息要先放入執行緒的訊息佇列,然後透過訊息迴圈分派到目標視窗(DispatchMessage)。一個執行緒的訊息佇列實際上分為四種不同的 訊息佇列:Post訊息佇列、Send訊息佇列、輸入訊息佇列、應答訊息佇列。PostMessage是將訊息追加到Post訊息佇列,SendMessage是追加到Send訊息佇列,兩個佇列處理的優先順序並不一樣。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28699126/viewspace-757235/,如需轉載,請註明出處,否則將追究法律責任。

相關文章