當前位置:學問君>學習教育>考研>

解釋一下Windows的消息機制

學問君 人氣:2.29W

Windows是一個消息(Message)驅動系統。Windows的消息提供了應用程序之間、應用程序與Windows系統之間進行通信的手段。應用程序想要實現的功能由消息來觸發,並且靠對消息的響應和處理來完成。

解釋一下Windows的消息機制

Windows系統中有兩種消息隊列:系統消息隊列和應用程序消息隊列。計算機的所有輸入設備由Windows監控。當一個事件發生時,Windows先將輸入的消息放入系統消息隊列中,再將消息拷貝到相應的`應用程序消息隊列中。應用程序的消息處理程序將反覆檢測消息隊列,並把檢測到的每個消息發送到相應的視窗函數中。這便是一個事件從發生至到達視窗函數必須經歷的過程。

必須注意的是,消息並非是搶佔性的,無論事件的緩急,總是按照到達的先後派對,依次處理(一些系統消息除外),這樣可能使一些實時外部事件得不到及時處理。

Windows中的消息是放在對應的進程的消息隊列裏的。可以透過GetMessage取得,並且對於一般的消息,此函數返回非零值,但是對於 WM_QUIT消息,返回零。可以透過這個特徵,結束程序。當取得消息之後,應該先轉換消息,再分發消息。所謂轉換,就是把鍵盤碼的轉換,所謂分發,就是把消息分發給對應的視窗,由對應的視窗處理消息,這樣對應窗體的消息處理函數就會被調用。兩個函數可以實現這兩個功能:TranslateMessage 和DispatchMessage。

另外,需要注意,當我們點擊視窗的關閉按鈕關閉視窗時,程序並沒有自動退出,而是向程序發送了一個WM_DESTROY消息(其實過程是這樣的,首先向程序發送WM_CLOSE消息,默認的處理程序是調用DestroyWindow銷燬窗體,從而引發WM_DESTROY消息),此時在窗體中我們要響應這個消息,如果需要退出程序,那麼就要向程序發送WM_QUIT消息(透過PostQuitMessage實現)。一個窗體如果想要調用自己的消息處理函數,可以使用SendMessage向自己發消息。

如上所述,大部分(注意是大部分)的消息是這樣傳遞的:首先放到進程的消息隊列中,之後由GetMessage取出,轉換後,分發給對應的視窗。這種消息成爲存儲式消息。存儲式消息基本上是使用者輸入的結果,以擊鍵(如WM_KEYDOWN和WM_KEYUP訊息)、擊鍵產生的字元(WM_CHAR)、鼠標移動(WM_MOUSEMOVE)和鼠標按鈕(WM_LBUTTONDOWN)的形式給出。存儲式消息還包含時鐘消息(WM_TIMER)、更新消息(WM_PAINT)和退出消息(WM_QUIT)。

但是也有的消息是直接發送給視窗的,它們被稱爲非存儲式消息。例如,當WinMain調用 CreateWindow時,Windows將建立視窗並在處理中給視窗消息處理函數發送一個WM_CREATE消息。當WinMain調用 ShowWindow時,Windows將給視窗消息處理函數發送WM_SIZE和WM_SHOWWINDOW消息。當WinMain調用 UpdateWindow時,Windows將給視窗消息處理函數發送WM_PAINT消息。