10

更新時間: 2016-03-25

廣告

「消息」是windows運行機制中一個基本而又重要的概念。消息是一個報告事件發生的通知,消息驅動是圍繞消息的產生與處理展開的,並依靠消息循環機制來實現。 \n從程序設計的觀點看,某條消息可被視為某個事件的發生,比如點擊滑鼠。事件即可以由用戶引發,也可以由應用程序產生,當然Windows本身也能發出消息。Windows應用程序的消息來源有4種:輸入消息,控制消息,系統消息,用戶消息。

廣告

消息驅動機制

1 消息驅動機制 - 1、消息驅動與消息循環

Windows是一個多任務操作系統,所以沒有哪一個程序能夠獨佔系統的資源,資源都是由Windows統一管理的。那麼某個程序是如何獲得用戶的信息呢?事實上,Windows在時刻監視著用戶的每個舉動,並分析用戶的動作與哪一個程序相關,然後將動作以消息的形式發送給當前的應用程序。相反,應用程序也在時時等著消息的到來,一旦發現它的消息隊列中有未處理的信息,就獲取並分析該消息,並根據消息所包含的內容採取適當的動作來響應。這裡我們引出另一個概念「消息驅動」。比如當你單擊file菜單的時候,首先這個動作被windows所捕獲,而不是應用程序。經分析windows知道該動作該由哪個應用程序處理,然後windows就發送WM_COMMAND消息給該應用程序,它告訴應用程序,你單擊了file菜單。應用程序得知這一消息后,便採取相應的動作來響應它,進行「消息處理」。Windows為每個線程維護了相應的消息隊列,應用程序的任務就是不停地從特定的消息隊列中獲取消息、分析消息並處理消息,直到消息(WM_QUIT)為止。這個過程的程序結構稱為「消息循環」。

2 消息驅動機制 - 2、消息傳送


發送消息和寄送消息
發送一個消息時,系統直接調用窗口進程。通信是即時的。直到窗口進程為調用函數返回一個結果后,應用程序才能繼續。
寄送一個消息時,系統把消息發送到擁有該窗口的應用程序消息隊列中。消息隊列是系統定義的一個內存塊,用於臨時存儲消息,或是把消息直接直接發給窗口過程。每個窗口維護自己的消息隊列,從中取出消息,利用窗口函數進行處理。一有空閑,應用程序就搜索消息隊列,並在消息隊列中處理消息,即從隊列中刪除他們。調用函數發送消息后就立即返回,但結果只是表示消息寄送成功與否,而不表示被調用窗口進程的結果。通常滑鼠和鍵盤消息是寄送的。

廣告

3 消息驅動機制 - 3、消息處理


Windows程序在處理消息時使用了「回掉函數」的特殊函數。這個函數由應用程序定義,但並不由應用程序來調用,而是共操作系統或者其子系統來調用的。這種調用通常在某一事件發生,或者在窗口或字體被枚舉時發生。Windows向程序員所能發送的消息多達百種,但是,對於一般的應用程序來說,只是其中的一部分有意義。

廣告

4 消息驅動機制 - 4、Windows對消息驅動機制的支持


Windows操作系統包括3個內核基本模塊:
GDI:負責在屏幕上繪製象素、列印硬考貝輸出,繪製用戶界面
KERNEL:支持與操作系統密切相關的功能。如進程載入,系統調用
USER:為所有的用戶界面對象提供支持,它用於接收和管理所有輸入消息、系統消息,並把他們發給相應的窗口的消息隊列。
上述GDI、KERNEL和USESR模塊中的庫函數可被應用程序調用,也可被其他程序模塊調用。Windows把包含庫函數的模塊稱為EXPORT,在WINDOWS提供的一種新的EXE文件中有一個入口表用於指明模塊內每個輸出函數的地址。
從應用程序方面,用到的庫函數被認為是IMPORT函數。應用程序對一個入口函數發出的遠程調用可用不同的重定位表來確定。幾乎所有的應用程序都至少包含一個入口庫函數或者稱為被外部調用的函數。該windows庫函數一般來自某個程序模塊,用於從WINDOWS接收消息,該函數的使用標誌必須是EXPORT,這才能使WINDOWS允許它被一個外部模塊正常調用。

廣告