WINDOWS訊息機制 一

2021-09-06 06:00:48 字數 1614 閱讀 2772

windows是乙個訊息驅動的錯做系統。乙個訊息由乙個訊息名稱(uint型別)和兩個引數(wparam,lparam)構成。當使用者進行了輸入或是視窗的狀態發生改變時,系統會傳送訊息到某個視窗。例如當選單選中之後會有wm_command訊息傳送,wparam的高字中(hiword(wparam))是命令的id號,對選單來說就是選單id。當然使用者也可以定義自己的訊息名稱,也可以利用自定義訊息來傳送通知和傳送資料。

乙個訊息必須由乙個視窗接收,在視窗的訊息處理函式中可以對訊息進行分析,對自己感興趣的訊息進行處理。例如希望對選單選擇進行處理,那麼可以定義對wm_command進行處理的**,如果希望在視窗中進行圖形輸出就對wm_paint進行處理。

事實上為了應付那些沒有被相應的訊息,windows為視窗編寫了預設的視窗訊息處理函式,這個視窗過程將負責處理那些程式中沒有處理的訊息。正因為有了這個預設視窗過程,程式設計師才可以利用windows的視窗進行開發而不必過多關注視窗各種訊息的處理。例如視窗在被拖動時會有很多訊息傳送,而程式設計師都可以不予理睬讓系統自己處理。

說到訊息就不能不說視窗控制代碼,系統通過視窗控制代碼在整個作業系統中唯一標識乙個視窗。傳送訊息時必須制定乙個視窗控制代碼表明該訊息由哪個視窗接收。而每個視窗都會有自己的視窗訊息處理函式,所以使用者的輸入就會被正確的處理。

下面這段微帶掩飾如何在視窗過程中處理訊息:

long windowproc(hwnd hwnd,uint umessagetype,wparam w,lparam l)

switch(umessagetype)

//使用switch語句將各種訊息分開

case wm_paint:  //處理繪製訊息

redraw();

break;

case wm_timer:  //處理定時器訊息

ontimer();

break;

case wm_lbuttondown:  //處理滑鼠左鍵按下的訊息

onlbuttondown();

break;

default:

defualtwndproc();  //預設的其他訊息處理函式

break;

在windows作業系統中維護著乙個活多個訊息佇列,所有產生的訊息都被放入佇列中。系統在佇列中每次取出一條,根據訊息的接收控制代碼而將該訊息傳送給擁有該視窗的訊息迴圈。每乙個執行的程式都有自己的訊息迴圈,在迴圈中得到屬於自己的訊息並根據接收視窗的控制代碼呼叫相應的視窗過程。而在沒有訊息時訊息迴圈就將控制權交給系統,從而使windows可以同時進行多個任務。下面的偽**演示了訊息迴圈的用法:

while(1)

id=getmessage();

if(id==wm_quit)

break;

dispatchmessage();

初看這段**容易給人一種錯覺,這是乙個忙等待(busy waiting)的訊息迴圈,因為採用了while(1)的迴圈方式,而忙等待是個非常糟糕的東西。

而實際上絕大部分時間裡這個程式是在阻塞狀態,因為程式沒有收到訊息通知時getmessage就不會反悔,所以也就不會占用系統的cpu時間。getmessage函式的阻塞呼叫時這段**的關鍵部分。

上面這段**的意思是呼叫getmessage函式從訊息佇列中取出訊息,然後呼叫dispatchmessage將訊息傳送給視窗訊息處理函式。

windows訊息機制

一 windows中有乙個系統訊息佇列,對於每乙個正在執行的windows應用程式,系統為其建立乙個 訊息佇列 即應用程式佇列,用來存放該程式可能 建立的各種視窗的訊息。應用程式中含有一段稱作 訊息迴圈 的 用來從訊息佇列中檢索這些訊息並把它們分發到相應的視窗函式中。二 windows為當前執行的每...

windows訊息機制

一 windows中有乙個系統訊息佇列,對於每乙個正在執行的windows應用程式,系統為其建立乙個 訊息佇列 即應用程式佇列,用來存放該程式可能 建立的各種視窗的訊息。應用程式中含有一段稱作 訊息迴圈 的 用來從訊息佇列中檢索這些訊息並把它們分發到相應的視窗函式中。二 windows為當前執行的每...

Windows訊息機制

訊息佇列分為 系統訊息佇列 執行緒訊息佇列 應用程式訊息佇列 系統訊息佇列 這是系統唯一的佇列,輸入裝置 滑鼠 鍵盤等 的驅動程式把使用者的操作轉換成訊息的形式放置到系統佇列中,然後系統會把此訊息轉到目標視窗所在的執行緒訊息佇列中等待處理。執行緒訊息佇列 每個gui 圖形使用者 介面 graphic...