對於SendMessage 和 PostMessage 平時口頭的解釋是
SendMessage 發送消息后等待返回,
PostMessage 發送消息后立即返回 。
但是這樣解釋還是不具體,什么叫等待 什么叫立即?
下面的代碼可以解釋,SendMessage 必須要等到消息響應函數結束,才繼續執行。
#define USER_MSG WM_USER+1 /*使用SendMessage的例子 程序執行的步驟 */ void fun() { // 第一步 SendMessage(hWnd,USER_MSG); // 第三步 return; } void OnUserMesssage() { // 第二步 do sth; }
/*使用PostMessage*/ #define USER_MSG WM_USER+1 void fun() { //第一步 PostMessage(hwnd,USER_MSG) ; //第二步 return; } //不知道是第幾步,等待消息隊列輪到USER_MSG消息被捕獲。 void OnUserMsg() { //等待窗口的后台消息處理過程通過GetMessage 取出了消息之后,再執行。 }
那么為什么要有這樣的區分?
場景1,在OnCreate 消息中,獲取子窗口的位置。
因為窗體以及其子窗口在OnCreate的時候還沒有創建完成,(收到了一個WM_CREATE消息)
此時,獲取子窗口的的位置是不可靠的。所以,可以在OnCreate 處理函數中,
向窗口以PostMessage發送一個自定義消息,等自定義消息響應時,OnCreate已經完成了。在自定義消息中獲取到子窗口的准確位置。
場景2,使用采集卡的例子中,當用戶發送采集信息,主程序需要得到一個圖片之后才繼續執行。那么就可以用SendMessage 來通知采集卡采圖。
如果用PostMessage,那么可能得到的是延遲一段時候后的圖。