天天看點

windows消息相關

1.sendmessage傳回值不能直接傳回消息函數的傳回值

解決方法:在消息對應傳回之前調用SetWindowLong(hDlg, DWL_MSGRESULT, iRet);

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的就可以,因為它要經過“第三者”嘛。