驅動訊息
從程式設計的觀點看,某條訊息可被視為某個事件的發生,比如點擊滑鼠。事件即可以由用戶引發,也可以由應用程式產生,當然Windows本身也能發出訊息。Windows應用程式的訊息來源有4種:輸入訊息,控制訊息,系統訊息,用戶訊息。
Windows是一個多任務作業系統,所以沒有哪一個程式能夠獨占系統的資源,資源都是由Windows統一管理的。那么某個程式是如何獲得用戶的信息呢?事實上,Windows在時刻監視著用戶的每個舉動,並分析用戶的動作與哪一個程式相關,然後將動作以訊息的形式傳送給當前的應用程式。相反,應用程式也在時時等著訊息的到來,一旦發現它的訊息佇列中有未處理的信息,就獲取並分析該訊息,並根據訊息所包含的內容採取適當的動作來回響。這裡我們引出另一個概念“訊息驅動”。比如當你單擊file選單的時候,首先這個動作被windows所捕獲,而不是應用程式。經分析windows知道該動作該由哪個應用程式處理,然後windows就傳送WM_COMMAND訊息給該應用程式,它告訴應用程式,你單擊了file選單。應用程式得知這一訊息後,便採取相應的動作來回響它,進行“訊息處理”。Windows為每個執行緒維護了相應的訊息佇列,應用程式的任務就是不停地從特定的訊息佇列中獲取訊息、分析訊息並處理訊息,直到訊息(WM_QUIT)為止。這個過程的程式結構稱為“訊息循環”。
訊息傳送
傳送訊息
傳送一個訊息時,系統直接調用視窗進程。通信是即時的。直到視窗進程為調用函式返回一個結果後,應用程式才能繼續。
寄送訊息
寄送一個訊息時,系統把訊息傳送到擁有該視窗的應用程式訊息佇列中。訊息佇列是系統定義的一個記憶體塊,用於臨時存儲訊息,或是把訊息直接發給視窗過程。每個視窗維護自己的訊息佇列,從中取出訊息,利用視窗函式進行處理。一有空閒,應用程式就搜尋訊息佇列,並在訊息佇列中處理訊息,即從佇列中刪除他們。調用函式傳送訊息後就立即返回,但結果只是表示訊息寄送成功與否,而不表示被調用視窗進程的結果。通常滑鼠和鍵盤訊息是寄送的。
訊息處理
Windows程式在處理訊息時使用了“回調函式”的特殊函式。這個函式由應用程式定義,但並不由應用程式來調用,而是供作業系統或者其子系統來調用的。這種調用通常在某一事件發生,或者在視窗或字型被枚舉時發生。Windows向程式設計師所能傳送的訊息多達百種,但是,對於一般的應用程式來說,只是其中的一部分有意義。
套用支持
基本模組
Windows作業系統包括3個核心基本模組:
GDI:負責在螢幕上繪製象素、列印硬拷貝輸出,繪製用戶界面
KERNEL:支持與作業系統密切相關的功能。如進程載入,系統調用
USER:為所有的用戶界面對象提供支持,它用於接收和管理所有輸入訊息、系統訊息,並把他們發給相應的視窗的訊息佇列。
上述GDI、KERNEL和USESR模組中的庫函式可被應用程式調用,也可被其他程式模組調用。Windows把包含庫函式的模組稱為EXPORT,在WINDOWS提供的一種新的EXE檔案中有一個入口表用於指明模組內每個輸出函式的地址。
應用程式
從應用程式方面,用到的庫函式被認為是IMPORT函式。應用程式對一個入口函式發出的遠程調用可用不同的重定位表來確定。幾乎所有的應用程式都至少包含一個入口庫函式或者稱為被外部調用的函式。該windows庫函式一般來自某個程式模組,用於從WINDOWS接收訊息,該函式的使用標誌必須是EXPORT,這才能使WINDOWS允許它被一個外部模組正常調用。