學習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的就可以,因為它要經過“第三者”嘛。
--- 就記到這裡,老闆喊我做事了。
--------------