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. 消息隊列
每一個Windows 應用程序開始執行后,系統都會為該程序創建一個消息隊列,這個消
息隊列用來存放該程序創建的窗口的消息。Windows 將產生的消息依次放入消息隊列中,而
應用程序則通過消息循環不斷從隊列中取出消息,進行響應。這種消息機制,就是Windows
程序運行的基本機制。
Windows
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。