Windows程式設計中一個比較原始的問題就是消息循環,現在很少有人關心這些了;
我個人對消息循環比較感興趣,對底層的很多細節想深入了解!
以下說明幾個消息循環中的常用函數進行對比
1 PostMessage 與 SendMessage 函數對比
SendMessage把消息直接發送到視窗,并調用此視窗的相應消息處理函數,等消息處理函數結束後SendMessage才傳回!SendMessage發送的消息不進入系統的消息隊列;SendMessage函數有傳回值
PostMessage将消息發送到與建立視窗的線程相關聯的消息隊列後立即傳回;PostMessage函數沒有傳回值;
2 GetMessage 與 PeekMessage函數的對比
GetMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax)
PeekMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax,UINT wRemoveMsg)
根據參數可以看出以上2個函數的差別,參數wRemoveMsg的作用是指定消息擷取的方式,如果設為PM_NOREMOVE,那麼消息将不會從消息隊列中被移出,如果設為PM_REMOVE,那麼消息将會從消息隊列中被移出;
還有差別:
他們如果沒有捕獲到消息,程式的主線程會被作業系統挂起。當作業系統再次回來照顧此線程時,發現消息隊列中仍然沒有消息可取,此時兩個函數的行為就不同了:
GetMessage : 過門不入,作業系統再次挂起此線程,去照顧别的線程;
PeekMessage: 取回控制權,使程式執行一段時間,等待可能的消息進入消息隊列并将其捕獲;這時程式進入空閑時間階段;