維尼的蜂巢

RealTime??!! It’s amazing!!!!

PostMessage和SendMessage的區別 十一月 25, 2006

Filed under: VC++/C++/C — kevinlin @ 9:34 下午

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

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 Responses to “PostMessage和SendMessage的區別”

  1. […] 下面兩篇網誌 有查到一些使用時機與用法 可以參考… [1]、[2] […]

  2. Ming Says:

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

    SendMessage(hwnd,BM_SETCHECK,BST_CHECKED,0);


發表迴響

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

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 變更 )

Twitter picture

You are commenting using your Twitter account. Log Out / 變更 )

Facebook照片

You are commenting using your Facebook account. Log Out / 變更 )

Google+ photo

You are commenting using your Google+ account. Log Out / 變更 )

連結到 %s