VC++/C++/C

PostMessage和SendMessage的區別

一值沒有注意這問題,這兩個都在隨性亂用,這次還真的用出問題了。

BOOL PostMessage(
    HWND hWnd,  // handle of destination window
    UINT Msg,   // message to post
    WPARAM wParam,      // first message parameter
    LPARAM lParam       // second message parameter
   );

LRESULT SendMessage(
    HWND hWnd,  // handle of destination window
    UINT Msg,   // message to send
    WPARAM wParam,      // first message parameter
    LPARAM lParam       // second message parameter
   );

內容都一樣,那我們來比較傳回值,SendMessage的傳回值是LRESULT、PostMessage的傳回直是bool,這意義重大啊!!關鍵都在這邊。
先說他們的用意:
SendMessage用在你需要馬上知道這個Message處理的結果,而
PostMessage只是把訊息丟入Message Queue會在下次進入訊息迴圈時才處理,傳回的bool只是跟你說,我這個函式有沒有執行成功,也就是說我們不管它到底什麼時候被處理,他有處理就好

所以深入來說,SendMessage就是當執行後會馬上去處理這個訊息,控制權會馬上交給接受Message的視窗(看你傳的hWnd),然後等他處理完該訊息,所以這個Message不會直接送給Message Queue。所以會傳回LRESULT,來讓我知道這訊息處理的怎樣。
我遇到的問題就是我很多地方都用SendMessage,變成有些東西被銷毀的時間點不對,導致整個程式最後會崩潰,其實還蠻糟糕的,現在終於發現這個地方了。

廣告

2 thoughts on “PostMessage和SendMessage的區別”

  1. 請問一下我想要用 api 控制另外一個程式的 checkBox 希望把勾
    勾打上去但是為何不會有反應??

    SendMessage(hwnd,BM_SETCHECK,BST_CHECKED,0);

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s