天天看點

Windows運作機理——消息與消息隊列

Windows運作機理這系列文章都是來至于《零基礎學Qt4程式設計》——吳迪,個人覺得寫得很好,是以進行了搬運和個人加工

Windows程式設計時一種基于消息的時機驅動方式的設計模式,完全不同于傳動的DOS方式的程式設計方法,在Windows中,程式設計的架構都是響應和發送消息。例如,當使用者在視窗中畫圖的時候,按下滑鼠左鍵,此時作業系統會感覺這一事件,于是将這個事件包裝成一個消息,投遞到應用程式的消息隊列中,然後應用程式從消息隊列中取出消息并響應,在這處理過程中,作業系統也給應用系統發送消息,所謂的“發送消息”,實際上是作業系統調用程式中一個專門處理消息的函數,稱為視窗過程。

1. 消息

在windows 程式中,消息是由MSG 結構體來表示的。MSG 結構體的定義如下:

typedef struct tagMSG
{
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
}MSG;           

該結構體中各成員變量的含義如下:

hwnd 表示消息所屬的視窗。我們開發的程式都是視窗應用程式,消息一般都是與某個

視窗相關聯的。在Windows 程式中,用HWND 類型的變量來辨別視窗。

message 變量指定了消息的辨別符。在Windows 中,消息是由一個數值來表示的,不同

的消息對應不同的數值。但是由于數值不便于記憶,是以Windows 将消息對應的數值定義

為WM_XXX 宏(WM 是Window Message 的縮寫)的形式,XXX 對應某種消息的英文拼寫的大

寫形式。例如,滑鼠左鍵按下的消息是WM_LBUTTONDOWN,鍵盤按下消息是WM_KEYDOWN,字

符消息是WM_CHAR 等等。在程式中,我們通常都是用WM_XXX 宏的形式來使用消息的。

此外,我們可以定義自己的消息,并給視窗發送這些消息,您完全不用擔心如何使這

些消息與代碼聯系起來,因為這是應用程式架構的事情。但是另一方面,這也在一定程度上

固定了程式設計上的一些結構。

wParam 和lParam 用于指定消息的其他附加資訊。比如,當我們收到一個字元消息的時

候,message 成員變量的值就是WM_CHAR,但使用者輸入的是那些字元,就由wParam 和

lParam 來說明。wParam、lParam 表示的資訊随消息的不同而有變化。

time 和pt 分别表示消息投遞到消息隊列的時間和滑鼠的目前位置。

2. 消息隊列

繼續閱讀