對SendMessage與PostMessage的理解

來源:互聯網
上載者:User
     學習VC++近幾個月的時間了。
     現在回過頭來回想訊息機制時,對SendMessage與PostMessage的區別與聯絡仍然是懵懵懂懂的。有些時候分不清到底是哪個發送訊息後會立即返回。
     因此,特別在這些記錄一下,以備不時不需:
     1、訊息結構體:1typedef struct tagMsg
2{
3  HWND hWnd;
4  UINT msg;
5  WPARAM wParam;
6  LPARAM lParam;
7  DWORD time;
8  POINT pt;
9}MSG;

      具體的意思就不記了,反正字面意思也很簡單。
    2、SendMessage與PostMessage的區別:
      先來看看Send與Post這兩個英文單詞的意思:Send有發送的意思,而Post具有投寄的意思。
      聯想一下現實生活中我們寫信(很久很久以前。。。。)來記就很簡單了:
      Send:  相當於郵寄員,他會將快件親手交給收件者,並且需要收件者簽字,他才閃人。而在訊息機制中,就是說,系統(郵寄員)會將收到的訊息(郵局分發)直接發送到某個視窗的視窗過程(收件者),並且需要該視窗作出處理(收件者簽字)才返回。 這東東就是SendMessage
      Post:  相當於郵局、郵筒等等,我們寫好信好,會將信交給郵局,或投寄到郵筒裡,而什麼時候發送,發送到哪裡都由郵局來處理,我們投寄信件的時候,是不會等候這封信件到達收件者手裡,然後才回家的。 而在訊息機制中,就是說,系統(我們)將收到的訊息(信件)投寄到應用程式的訊息迴圈(相當於郵筒)中,然後就閃人,具體啥時候處理這條訊息(啥時候發送郵件),那就得看“辦事效率”了。
      區別很明顯,SendMessage的訊息是不進隊列的,而PostMessage的需要排隊。 
      但,值得說明的是:雖然一個要進隊,一個不進隊,但是最終處理訊息的地方都一樣:都是系統調用視窗過程進行處理(收件者作出反應)
      
     類似的,還有一對函數 PeekMessage和GetMessage~~~~
    3、PreTranslateMessage
     我們可以PreTranslateMessage來對訊息預先處理,該用的用,不該用的不用。那麼,是否Send和Post來的訊息我們都可以用它來預先處理呢?
     答案當然是否定的:如果你在深圳,要寫封信寄到東北去,那麼投寄方式有兩種:1、自己帶著信跑到東北去,2、將信放到郵局,由郵局分發。
     第1 種情況下,就是SendMessage了,這個時候,還有誰能預先處理你的信呢?
     第2種情況下,就是PostMessage了,這個時候,嘿嘿,萬一運氣不好,被郵局給用PreTranslateMessage給截了.....
     所以說,用SendMessage發送的訊息是不能用PreTranslateMessage來預先處理的。而Post的就可以,因為它要經過“第三者”嘛。

--- 就記到這裡,老闆喊我做事了。

--------------

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.