Windows消息機制

消息和消息類型

消息自己是做爲一個記錄傳遞給應用程序的,這個記錄中包含了消息的類型以及其餘信息。這個記錄類型叫作MSG,MSG含有來自windows應用程序消息隊列的消息信息,在Windows中MSG結構體定義以下:windows

typedef struct tagMsg  
{  
       HWND    hwnd;       //接受該消息的窗口句柄  
       UINT    message;    //消息常量標識符,也就是咱們一般所說的消息號  
       WPARAM  wParam;     //32位消息的特定附加信息,確切含義依賴於消息值  
       LPARAM  lParam;     //32位消息的特定附加信息,確切含義依賴於消息值  
       DWORD   time;       //消息建立時的時間  
       POINT   pt;         //消息建立時的鼠標/光標在屏幕座標系中的位置  
}MSG;

 hwnd - - - 一個32位的窗口句柄(個人PC是32 位的),它表示的是消息所屬的窗口。咱們一般開發的程序都是窗口應用程序,通常一個消息都是和某個窗口相關聯的。好比咱們在某個活動窗口按下鼠標右鍵,此時產生的消息就是發送給該活動窗口的。窗口能夠是任何類型的屏幕對象,由於Win32可以維護大多數可視對象的句柄(窗口、對話框、按鈕、編輯框等)。

(補充一下:「句柄」\---在Windows程序中,有各類各樣的資源,系統在建立這些資源的時候,都會爲他們分配內存,並返回標識這些資源的標識號,這個標識號就是句柄)  
       message\- - - -一個消息的標識符,用於區別其餘消息的常量值,這些常量能夠是Windows單元中預約義的常量,也能夠是自定義的常量。在Windows中消息是由一個數值表示的,不一樣的消息對應不一樣的數值。但因爲當這些消息種類多到足以挑戰咱們的IQ,因此聰明的程序開發者便想到將這些數值定義爲WM\_XXX宏的形式。例如,鼠標左鍵按下的消息--WM\_LBUTTONDOWN,鍵盤按下消息--WM\_KEYDOWN,字符消息--WM\_CHAR,等等。。。。消息標識符以常量命名的方式指出消息的含義。當窗口過程接收到消息以後,他就會使用消息標識符來決定如何處理消息。例如、WM\_PAINT告訴窗口過程窗體客戶區被改變了須要重繪。符號常量指定系統消息屬於的類別,其前綴指明瞭處理解釋消息的窗體的類型。  
        wParam和lParam- \- - 用於指定消息的附加信息。例如,當咱們收到一個鍵盤按下消息的時候,message成員變量的值就是WM\_KEYDOWN,可是用戶到底按下的是哪個按鍵,咱們就得拜託這二位,由他們來告知咱們具體的信息。

time和pt- \- -這倆兄弟分別被用來表示消息投遞到消息隊列中的時間和鼠標當前的位置,通常狀況下不怎麼使用(但不表明沒用)
WM\_NULL---0x0000    空消息。  
 0x0001----0x0087    主要是窗口消息。  
 0x00A0----0x00A9    非客戶區消息   
 0x0100----0x0108    鍵盤消息  
 0x0111----0x0126    菜單消息  
 0x0132----0x0138    顏色控制消息  
 0x0200----0x020A    鼠標消息  
 0x0211----0x0213    菜單循環消息  
 0x0220----0x0230    多文檔消息  
 0x03E0----0x03E8    DDE消息  
 0x0400             WM\_USER  
 0x8000             WM\_APP  
 0x0400----0x7FFF    應用程序自定義私有消息

系統定義消息(System-Defined Messages)
        在SDK中事先定義好的消息,非用戶定義的,其範圍在[0x0000, 0x03ff]之間, 能夠分爲如下三類: 函數

  • 1> 窗口消息(Windows Message)

       與窗口的內部運做有關,如建立窗口,繪製窗口,銷燬窗口等。能夠是通常的窗口,也能夠是Dialog,控件等。 
如:WM_CREATE, WM_PAINT, WM_MOUSEMOVE, WM_CTLCOLOR, WM_HSCROLL... 工具

  • 2> 命令消息(Command Message)

        與處理用戶請求有關, 如單擊菜單項或工具欄或控件時, 就會產生命令消息。 
WM_COMMAND, LOWORD(wParam)表示菜單項,工具欄按鈕或控件的ID。若是是控件, HIWORD(wParam)表示控件消息類型 線程

  • 3> 控件通知(Notify Message)

        控件通知消息, 這是最靈活的消息格式, 其Message, wParam, lParam分別爲:WM_NOTIFY, 控件ID,指向NMHDR的指針。NMHDR包含控件通知的內容, 能夠任意擴展。指針

程序定義消息(Application-Defined Messages)
        用戶自定義的消息, 對於其範圍有以下規定: 
WM_USER: 0x0400-0x7FFF      (ex. WM_USER+10) 
WM_APP(winver> 4.0): 0x8000-0xBFFF (ex.WM_APP+4) 
RegisterWindowMessage: 0xC000-0xFFFFcode

消息隊列對象

系統消息隊列(System Message Queue)
這是一個系統惟一的Queue,設備驅動(mouse, keyboard)會把操做輸入轉化成消息存在系統隊列中,而後系統會把此消息放到目標窗口所在的線程的消息隊列(thread-specific message queue)中等待處理
線程消息隊列(Thread-specific Message Queue)
每個GUI線程都會維護這樣一個線程消息隊列。(這個隊列只有在線程調用GDI函數時纔會建立,默認不建立)。而後線程消息隊列中的消息會被送到相應的窗口過程(WndProc)處理.
注意: 線程消息隊列中WM_PAINT,WM_TIMER只有在Queue中沒有其餘消息的時候纔會被處理,WM_PAINT消息還會被合併以提升效率。其餘全部消息以先進先出(FIFO)的方式被處理。隊列

相關文章
相關標籤/搜索