windows訊息和訊息佇列例項詳解

2023-01-22 19:54:05 字數 4307 閱讀 2725

與基於ms - dos的應用程式不同,windows的應用程式是事件(訊息)驅動的。它們不會顯式地呼叫函式(如c執行時庫呼叫)來獲取輸入,而是等待windows向它們傳遞輸入。 windows系統把應用程式的輸入事件傳遞給各個視窗,每個視窗有乙個函式,稱為視窗訊息處理函式。

視窗訊息處理函式處理各種使用者輸入,處理完成後再將控制權交還給系統。視窗訊息處理函式一般是在註冊乙個視窗的時候指定的。你可以從典型的sdk程式中視窗訊息處理函式是怎麼宣告和實現的。

對於windows xp系統:如果頂層視窗停止響應訊息超過幾秒鐘,系統會認為視窗無回應。在這種情況下,系統將隱藏這個視窗,然後生成乙個影子(ghost)視窗覆蓋在它上面。

這個影子視窗具有著相同的z軸順序,位置,大小,顯示屬性。影子視窗允許使用者將其移動,調整大小,甚至關閉(關閉的是停止響應的window)。此時只有這幾個動作是被允許的,在除錯模式下,系統不會生成影子視窗。

本節討論以下主題:

windows訊息

1. 訊息型別

2. 訊息傳遞

3. 訊息處理

4. 訊息過濾

5. post message和send message

6. 訊息死鎖

7. 廣播訊息

8. 查詢訊息

現分述如下:

1. windows訊息

windows通過訊息的形式向視窗傳遞使用者輸入。訊息可以由系統和應用程式生成。該系統會為每個輸入事件產生相應的訊息,

例如,使用者點選滑鼠,移動滑鼠或滾動條,或是應用程式改變了系統的某些屬性,比如說系統更改了字型資源,改變了某個視窗的

大小。 不僅如此,應用程式可以生成訊息,通告傳送訊息指定它的窗體去執行某些任務或者是與其他的應用程式互動。

windows系統將訊息傳送到乙個視窗訊息處理函式時傳遞四個引數:視窗控制代碼,訊息識別符號,兩個dword值(訊息引數)。

視窗控制代碼標識了該訊息的目的視窗。windows使用它來確定是哪個視窗的的視窗訊息處理函式收到該訊息。

乙個訊息識別符號是乙個有名字的常量,用來表明訊息的意義。當乙個視窗處理函式收到一條訊息,它根據判斷訊息識別符號來決定如何處理該訊息,例如,訊息識別符號wm_paint訊息告訴視窗程式視窗的客戶區已發生變化,必須重繪。 訊息引數(dword值)指定傳遞的資料或是資料的位址。

訊息引數可以是乙個整型值,乙個指標值。也可以為null。

乙個視窗過程必須根據訊息識別符號來確定如何解釋訊息引數。

2. windows 訊息型別

本節描述訊息的兩種型別:

(1) 系統定義的訊息

(2) 應用程式定義的訊息

系統定義的訊息

作業系統向應用程式傳送訊息來和應用程式通訊。作業系統通過訊息控制應用程式的執行,向應用程式傳遞使用者輸入以及一些其他有用的資訊。

應用程式也可以傳送系統定義的訊息,應用程式通過這些訊息去控制使用註冊視窗類建立的控制項的視窗的執行。

每個系統定義的訊息都有乙個唯一的訊息識別符號和相應的符號常量(在windows sdk的標頭檔案裡定義)。符號常量通常會表明系統定義的訊息所屬的類別。不同的字首表明不同的類別。

一下是常見的分類:

prefixmessage category

wm general window(一般的視窗)

abm application desktop ******* (應用程式桌面工具條)

bm button control (按鈕控制項)

cb combo box control (組合框控制項)

cbemextended combo box control(擴充套件的組合框控制項)

cdm common dialog box (普通的對話方塊)

dbt device (裝置)

dl drag list box (下拉列表)

dm default push button control (預設按鈕控制項)

dtm date and time picker control(日期和時間選擇控制項)

em edit control (編輯控制項)

hdm header control (表頭控制項)

hkm hot key control (熱鍵控制項)

ipm ip address control (ip位址控制項)

lb list box control (列表框控制項)

lvm list view control (列表檢視控制項)

mcm month calendar control (數學日曆控制項)

pbm progress bar (進度條控制項)

pgm pager control ()

psm property sheet (屬性頁)

rb rebar control (分隔條控制項)

sb status bar window (狀態條控制項)

sbm scroll bar control (滾動條控制項)

stm static control (靜態控制項)

tb ******* (工具條)

tbm trackbar (跟蹤欄)

tcm tab control (選項卡控制項)

ttm tooltip control ()

tvm tree-view control ()

udm up-down control ()

應用程式可以通過建立自定義的訊息,用來和自己的視窗和其他程序通訊。如果應用程式建立了自己的訊息,視窗處理函式可以解析這些資訊,並作出相應的處理。

訊息識別符號值的取值範圍:

該系統保留了乙個訊息範圍,從0x0000到0x03ff(0x03ff等於wm_user -1)範圍. 這個範圍內的值為系統定義的訊息。應用程式不能使用這些值作為自己的自定義訊息。

從0x0400(數值wm_user)到0x7fff的值是為應用程式保留的。應用程式可以使用這個範圍內的值來定義自己的訊息。

如果你的操作係用的版本(windows version)主版本為4.0版,你還可以使用0x8000(wm_app)到0xbff之間的值來定義自己的訊息。

除此之外,應用程式還可以呼叫registerwindowmessage函式註冊乙個訊息時,作業系統會返回乙個介於0xc000和0xffff之間的乙個訊息識別符號。並且保證這個返回值是系統唯一的。因此,可以避免和其他應用程式使用的訊息相衝突。

3. 訊息派發

windows使用兩種方法將消派發到乙個視窗訊息處理函式:一是將訊息放到訊息佇列(先進先出佇列),二是不放到訊息佇列,直接傳送到視窗訊息處理函式,讓視窗處理函式來處理訊息。

派發到訊息佇列的訊息被稱為排隊訊息(queued messages)。它們主要是使用者輸入事件,比如說滑鼠或鍵盤訊息盤,有wm_mousemove訊息,wm_lbuttondown,wm_keydown,和wm_char訊息。還有一些其他的,包括wm_timer,wm_paint,以及wm_quit。

大多數其他的訊息息,這是直接傳送到視窗過程,被稱為非佇列訊息(non queued messages)。

(1) 佇列(queued)訊息

windows可同時顯示任意數量的視窗。此時,系統使用訊息佇列來將鍵盤和滑鼠事件正確的派發到正確的視窗。

windows維護著乙個系統訊息佇列,以及分別為每個gui執行緒維護乙個各自的執行緒訊息佇列。為了避免非gui執行緒的建立執行緒訊息佇列的開銷,所有執行緒建立初始化時,均不建立訊息佇列。只有當執行緒第一次呼叫gdi函式時,系統才會為執行緒建立訊息佇列。

所以那些非gui執行緒是沒有訊息佇列的。

每當使用者移動滑鼠,點選按鈕或鍵盤時,滑鼠或鍵盤的裝置驅動程式會將輸入轉換成訊息,並將訊息放在系統訊息佇列裡。刪windows會檢查自己的訊息佇列,如果訊息佇列不為空,則每次取出並刪除乙個訊息,然後確定訊息的目標視窗,然後把訊息放到建立這個視窗的執行緒的執行緒訊息佇列裡。執行緒的訊息佇列接收由執行緒建立的視窗的所有的滑鼠和鍵盤訊息。

然後執行緒會從佇列中刪除資訊,並告訴系統把它們派發到對應的視窗訊息處理函式。

除了wm_paint, wm_timer和wm_quit訊息以外,系統總是派發放在在訊息佇列的末尾的訊息。這將保證讓乙個視窗以first-in, first-out的順序接收訊息。wm_paint,wm_timer,和wm_quit訊息,會一直被儲存在佇列中,只有在佇列中沒有其他訊息時才會被派發到視窗訊息處理函式。

此外,同乙個視窗的多個wm_paint訊息被合併成乙個wm_paint訊息,客戶區的所有無效部分也會被合併。這樣是為了減少視窗重繪客戶區的次數。

windows向執行緒訊息佇列傳遞訊息時,首先會填充乙個msg結構,然後將這個msg結構複製到訊息佇列。msg中的資訊包括:目標視窗,訊息識別符號,兩個訊息引數,訊息派發時的時間,滑鼠游標位置。。

應用程式可以使用getmessage函式從自己的訊息佇列中刪除訊息。檢視而不刪除訊息,用的是peekmessage函式。

peekmessage函式會返回乙個帶有訊息資訊的msg結構。

第203章處理錯誤和訊息

概覽內容錯誤處理簡介 檢查螢幕欄位的有效性 理解自動字段檢查 檢查螢幕流邏輯中的字段 在 abap 4 中檢查字段 檢查單個字段 檢查多個字段 有條件地呼叫模組 條件 field 語句 條件 chain 語句 避免自動字段檢查 發布訊息 傳送訊息 建立訊息類 建立訊息 當使用者鍵入螢幕輸入時 事務在...

社會實踐訊息

國際關係學院師生開展2012暑期社會實踐 2012年7月29日,國際關係學院響應校團委假期開展社會實踐的號召,在國際關係學院黨總支書記湯國平同志的帶領下,黨總支副書記徐晉 國際政治系教師陳本昌 南韓語系外教趙炳寬 團委書記鄧曉文以及部分學生代表參與了為期一天的暑期社會實踐活動。一 參觀工業園區,感嘆...

ActiveMQ持久化訊息

1 前言 a 持久化為檔案 這個你裝activemq時預設就是這種,只要你設定訊息為持久化就可以了。涉及到的配置和 有 level,b 持久化為mysql 你首先需要把mysql的驅動放到activemq的lib目錄下,我用的檔案名字是 接下來你修改配置檔案 在配置檔案中的broker節點外增加 從...