詳談Windows訊息迴圈機制

2022-09-01 20:27:18 字數 2454 閱讀 2718

一直對windows訊息迴圈不太清楚,今天做個詳細的總結,有說錯的地方,請務必指出。

程式入口                                          //intwinapi winmain

定義視窗類                                      //typedef struct tagwndclassa

註冊視窗類                                      //registerclass(&wndclass))

生成視窗                                          //createwindow

更新視窗                                          //showwindow(hwnd,icmdshow);

顯示視窗                                          //updatewindow(hwnd);

訊息迴圈                                          //while(getmessage(&msg,null,0,0))

視窗訊息處理(**函式)                     //lresult callback wndproc

訊息迴圈的**如下:

while(getmessage(&msg, null, 0, 0) > 0) 

這裡有幾個概念,容易混淆:

1.系統:

特指windows作業系統

2.應用程式:

指乙個程式,比如qq,或者酷狗之類的都算乙個應用程式

3.視窗:

每個應用程式都可以擁有視窗,而且可以有多個,但一般會有乙個主視窗。例如qq的主視窗,但是qq也有很多類似於設定視窗的子視窗,這些視窗都屬於qq應用程式。

4.訊息:

window系統定義了很多種訊息,例如,單擊滑鼠、改變視窗尺寸、按下鍵盤,這些操作都會使windows傳送乙個訊息給應用程式。訊息本身是作為乙個記錄傳遞給應用程式的,這個記錄中包含了訊息的型別以及其他資訊

5.訊息迴圈:

window系統的一種訊息機制

6.訊息佇列:

是屬於執行緒的,是windows系統為執行緒建立並維護的乙個佇列,用於存放各類訊息。系統自身維護乙個系統訊息佇列,然後還為每個gui執行緒執行緒維護乙個執行緒專門訊息佇列。

7.執行緒:

每個執行緒預設是沒有訊息佇列的,執行緒只有在第一次呼叫使用者介面時(比如建立視窗,或者是操作ui元素時),系統才為其建立訊息佇列。乙個應用程式可以有多個執行緒,但只能有乙個ui執行緒,預設為主執行緒,其他子執行緒是無法操作ui並建立ui元素的。這是windows規定的

windows訊息迴圈的詳細過程:

1.我們建立完win32應用程式,當使用者通過對滑鼠,鍵盤操作應用程式時,由於windows一直監控著i/o裝置,該事件首先會被轉化成訊息,由windows系統捕獲,存放於系統訊息佇列。

2.windows系統知道該訊息應由哪個應用程式處理,然後拷貝到相應的應用程式訊息佇列。同時將該訊息從系統訊息佇列中刪除。

3.應用程式的訊息迴圈不斷在執行,此時,呼叫getmessage()從訊息佇列中查詢訊息,發現了該訊息

,getmessage()將返回乙個正值,並獲取到了該訊息msg;ps:如果訊息隊列為空,程式將停止執行並等待(程式阻塞)。

4. 然後取出訊息(msg)並將其傳遞給translatemessage()函式,這個函式做一些額外的處理:將虛擬鍵值資訊轉換為字元資訊。這一步實際上是可選的,但有些地方需要用到這一步。

5. 上面的步驟執行完後,將訊息msg傳遞給dispatchmessage()函式。dispatchmessage()函式將訊息再給windows系統,由windows系統找到目標視窗並分發給該視窗,呼叫訊息對應的視窗過程函式,既視窗的winpro函式,讓winpro

函式處理。

winpro函式可以允許我們對不同的訊息做特定的處理,若不處理的話,則會呼叫defwindowproc函式,做預設處理,所以為什麼預設**中winpro的型別是callback(**),因為不是我們主動呼叫的,是系統**的

6. 一旦乙個訊息處理完成,視窗過程winpro

函式返回,dispatchmessage()函式返回,應用程式的訊息迴圈繼續while迴圈,window系統繼續監控各類訊息,重複上述步驟

參考資料:

windows訊息機制

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

windows訊息機制

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

Windows訊息機制

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