Windows操作系統是基於消息響應機制的被動式系統。Windows應用程序是消息驅動程序,又稱事件驅動程序。事件驅動意味著操作系統的每一部分之間以及操作系統與應用程序之間是通過“消息”進行通信聯系的。因此,學習消息機制對於學習Windows應用程序編程是非常重要的。 1、消息定義 消息是指Windows發出的一個通知,告訴應用程序某個事情發生了。例如鼠標單擊,改變窗口大小,按下鍵盤按鍵等都會使Windows發送一個消息給應用程序。它可以由硬件、Windows、應用程序共同產生。消息通常分為一下四種: (1)標準消息:除了WM_command消息外,所有的以WM_開頭的消息都是標準消息。如鼠標移動,窗口移動,窗口大小改變等。程序啟動或退出甚至每一段固定的時間都會產生標準Windows消息。 (2)命令消息:來自與菜單,加速鍵,工具欄按鈕的消息,這類消息都是以WM_COMMAND形式呈現。 (3)通知消息:由空間產生的消息。按鍵和鼠標單擊列表框都會產生這類消息,這類消息的目的是為了向父窗口通知事件的發生,他也是以WM_COMMAND形式呈現的。 (4)用戶自定義的消息。 2、消息結構 在Windows程序中,消息本身是作為一個記錄傳遞給應用程序的,這個記錄中包含了消息的類型以及其他信息,由MSG結構體表示。MSG結構體的定義如下: type struct tagMSG{ HWND hwnd; //窗口句柄 UINT message; //消息類型 WPARAM wParam; //消息附件參數,具體內容取決於消息類型 LPARAM lParam; //消息附件參數,具體內容取決與消息類型 DWORD time; //消息產生的時間 POINT pt; //消息被發送時,鼠標在屏幕上的位置 }MSG; 在MSG結構中,消息是由一個消息名稱(UINT)和兩個參數(WPARAM和LPARAM)組成。當用戶進行了輸入或著窗口的狀態發生改變時,系統都會發送消息到某一個窗口。例如,當菜單點中之後會有WM_COMMAND消息發送。其中WPARAM的高字節(HIWORD(wParam))是命令的ID號,是菜單ID。同時,用戶也可以自定義消息名稱,也能利用自定義消息來發送通知和傳遞數據。 系統通過窗口句柄在整個系統中唯一標識一個窗口,發送一個消息時必須指定一個窗口句柄,表明該消息由指定的窗口接收。窗口可以是任何類型的屏幕對象,因為Win32能夠維護大多數可視對象的句柄(窗口、對話框、按鈕、編輯框等)。句柄決定消息被發送到哪一個窗口。 3、消息發送 在Windows中發送消息時,一般使用PostMessage和SendMessage函數,但是他們在發送方式上有些差別。二者最基本的區別在於SendMessage()函數直接調用指定窗口處理函數並等待消息處理完成才返回,PostMessage()函數是把消息封裝成一個MSG結構,投放到消息隊列中,然後立即返回,無需等待消息處理。 註:PostMessage和SendMessage區別 1)、SendMessage函數要等到消息被處理後才返回 PostMessage 消息發出後馬上返回 2)、PostMessage發向目標窗口的消息一定會進入消息隊列 SendMessage向同一線程的窗口發消息,不會進入消息隊列 SendMessage向其他線程的窗口發消息,則會進入消息隊列 3)、PostMessage的返回值表示PostMessage函數執行是否正確 SendMessage的返回值表示其他程序處理消息後的返回值
Tags: Windows message 編程入門 應用程序 工具欄
文章來源: