windows消息处理机制
消息
Windows程序設計是一種完全不同于傳統的DOS方式的程序設計方式,它是一種事件驅動的程序設計模式,主要是基于消息的。
例如,當用戶在窗口窗口中畫圖的時候,按下鼠標左鍵,此時,操作系統會感知到這一事件,于是將這個事件包裝成消息,投遞到應用程序的消息隊列中,然后應用程序從消息隊列中取出消息并進行處理。在這個處理過程中,操作系統會調用程序中一個專門負責處理消息的函數進行處理,這個函數稱為“窗口過程”。
消息是由MSG結構體來表示的,MSG結構體的定義如下:
typedef struct tagMSG { HWND hwnd; //消息所屬的窗口UINT message; //消息標識符WPARAM wParam; //消息附加信息LPARAM lParam; //消息附件信息DWORD time; //消息投遞到消息隊列中的時間POINT pt; //鼠標當前的位置 } MSG;
在windows中,消息是由一個數值來表示的,不同的消息對應一個不同的值。為了方便記憶,消息一般都定義成WM_XXX的形式(WM是Window Message的縮寫),XXX是對應某種消息的英文拼寫的大寫形式。
例如:
#define WM_MOUSEMOVE 0x0200 //鼠標移動 #define WM_LBUTTONDBLCLK 0x0203 //鼠標左鍵雙擊
消息隊列
每一個Windows應用程序開始執行后,系統都會為程序創建一個消息隊列,這個消息隊列用來存放該程序創建的窗口的消息。Windows將產生的消息依次放到消息隊列中去,而應用程序則通過一個消息循環不斷地從消息隊列中取出消息,并進行響應。這種消息機制,就是windows程序運行的機制。
消息處理機制
為了能夠不斷響應消息,應用程序需要編寫一個消息循環,不斷的從消息隊列中獲取消息,消息的獲取需要用到GetMessage()函數。該函數的原型聲明如下:
BOOL GetMessage( LPMSG lpMsg, //指向一個消息(MGS)的結構體HWND hWnd, //指定接收哪個窗口的消息,若為NULL接收所有窗口UINT wMsgFilterMin, //獲取消息的最小值UINT wMsgFilterMax //獲取消息的最大值);
注意:
wMsgFilterMin和wMsgFilterMax通常都為0,表示接受所有的消息。GetMessage函數接收到除WM_QUIT外的消息均返回非零值。對于WM_QUIT消息,該函數返回零。如果出現了錯誤,該函數返回-1,例如,當參數hWnd是無效的窗口句柄或lpMsg是無效的指針時。
通常我們編寫的消息循環代碼如下:
TranslateMessage
該函數的作用是將虛擬鍵消息轉換為字符消息,字符消息被投遞到調用線程的消息隊列中,當下一次調用GetMessage函數時被取出。
例如:
當我們敲擊鍵盤上的某個字符鍵時,系統將產生WM_KEYDOWN和WM_KEYUP消息,這兩個消息的附近參數(wParam和lParam)包含的是虛擬鍵代碼和掃描碼等信息,而我們經常用的是ASCII碼,TranslateMessage可以將WM_KEYDOWN和WM_KEYUP消息組合轉換成產生WM_CHAR消息,該消息的wParam包含了字符的ASCII碼,并將新的消息投遞到調用線程的消息隊列中,TranslateMessage函數只是產生了新消息,并沒有去修改原有的消息。
?
DispatchMessage
?
該函數分派一個消息到窗口過程,由窗口過程函數對消息進行處理。DispatchMessage實際上是將消息回傳給操作系統,由操作系統調用調用窗口過程函數對消息進行響應,如下圖所示。
? ? ? ? ? ? ? ? ? ? ? ? ? ??
(1) 操作系統接收到應用程序的窗口消息,將消息投遞到應用程序的消息隊列中。
(2) 應用程序在消息循環中調用GetMessage函數從消息隊列中獲取出一條一條的消息。
(3)應用程序調用DispatchMessage,將消息回傳給操作系統。
(4)操作系統利用WNDCLASS結構體的lpfnWndProc成員保存的窗口過程函數的指針調用窗口過程,對消息進行響應。
轉載于:https://www.cnblogs.com/jinxiang1224/p/8468391.html
總結
以上是生活随笔為你收集整理的windows消息处理机制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 5 个最受人喜爱的开源 Django 包
- 下一篇: kinect数据读取