解釋一下Windows的訊息機制

才智咖 人氣:2.27W

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訊息。