999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

深入分析Windows消息機制

2011-04-16 09:15:46王光輝
電腦與電信 2011年2期
關鍵詞:機制系統

王光輝

(成都理工大學信息科學與技術學院,四川成都610059)

1.引言

Windows操作系統是基于消息響應機制的被動式系統。Windows應用程序是消息驅動[1]程序,又稱事件驅動程序。事件驅動意味著操作系統的每一部分之間以及操作系統與應用程序之間是通過“消息”進行通信聯系的。由此可見,消息機制在Windows應用編程[2]的重要性。

2.消息

2.1 消息定義

消息是指Windows發出的一個通知[3],告訴應用程序某個事情發生了。例如,單擊鼠標、改變窗口大小、按下鍵盤上的一個鍵都會使Windows發送一個消息給應用程序。它可以由硬件、Windows、應用程序共同產生。消息通常分為以下四種:

(1)標準消息:除了WM_COMMAND,所有的以WM開頭的消息都是標準消息。如窗口、鼠標移動、窗口大小改變等。程序啟動或退出甚至每一段固定的時間都會產生標準Windows消息。

(2)命令消息:來自于菜單、加速鍵、工具欄按鈕的消息,這類消息都以WM_COMMAND形式呈現。

(3)通知消息:由控件產生的消息。按鍵和鼠標的單擊列表框都會產生這類消息[4],這類消息的目的是為了向父窗口(通常是對話框)通知事件的發生,它也是以WM_COMMAND形式呈現的。

(4)用戶自定義的消息。

2.2 消息結構

在Windows程序中,消息本身是作為一個記錄傳遞給應用程序的,這個記錄中包含了消息的類型以及其它信息,由MSG結構體表示。MSG結構體的定義如下:

在MSG結構中,消息是由一個消息名稱(UINT)和兩個參數(WPARAM,LPARAM)組成。當用戶進行了輸入或者窗口的狀態發生改變時,系統都會發送消息到某一個窗口。例如,當菜單點中之后會有WM_COMMAND消息發送。其中,WPARAM的高字節(HIWORD(wParam))是命令的ID號,是菜單ID。同時,用戶能定義自己的消息名稱,也能利用自定義消息來發送通知和傳送數據。

系統通過窗口句柄在整個系統中唯一標識一個窗口,發送一個消息時必須指定一個窗口句柄表明該消息由指定窗口接收。窗口可以是任何類型的屏幕對象,因為Win32能夠維護大多數可視對象的句柄(窗口、對話框、按鈕、編輯框等)。句柄決定消息被發送到哪個窗口。

2.3 消息發送

在Windows中發送消息時,一般使用PostMessage()和SendMessage()函數[5],但是它們在發送方式上有些差別。二者最基本的區別在于SendMessage()通過調用窗口過程,把消息立即發往另一個窗口并且等到該消息被處理完后才返回。PostMessage()是把消息封裝成一個MSG結構,投遞到消息隊列中,然后立即返回,無需等待。因此,PostMessage()是異步的,SendMessage()是同步的;PostMessage()只負責將消息放到消息隊列中,不確定何時處理。SendMessage()要等到收到消息處理的返回碼(DWord類型)后才繼續;PostMessage()執行后馬上返回,SendMessage()必須等到消息被處理后才會返回。

3.Windows消息機制

Windows消息機制是由消息隊列、消息循環和窗口過程三個部分組成。

3.1 消息隊列

Windows為所有消息維護著一個系統消息隊列,而對于每一個應用程序,系統又將會創建一個對應的消息隊列。Windows根據消息結構的內容將不同的消息發送給相應應用程序的消息隊列。應用程序通過PeekMessage()或GetMessage()函數從Windows消息隊列中獲取消息,然后分派給某個窗口。Windows保存的消息隊列是以線程(Thread)來分組的,即每個線程都有自己的消息隊列。

3.2 消息循環

通過Windows消息循環機制[6],應用程序能從消息隊列中檢索消息,再把它分派給適當的窗口。然后繼續從消息隊列中檢索下一條消息,再分派給適當的窗口,依次進行。函數的原型為:

消息循環以GetMessage()調用開始,它從消息隊列中取出一個消息。當取出的消息為WM_QUIT(退出消息),消息循環和應用程序退出。TranslateMessage()函數將鍵盤按鍵的虛擬碼轉換為ASCII碼,同時將WM_CHAR消息發送到消息隊列中。DispatchMessage()函數將消息轉發給Windows操作系統來調用相應的窗口過程函數處理。如果消息隊列為空,應用程序就將控制權交還給Windows。如果有需要控制權的應用程序,Windows就將控制權轉交給應用程序。這種控制權的交換使得Windows成為多任務的操作系統。

3.3 窗口過程

窗口過程是用來接收傳遞給窗口的消息,它的任務就是獲取消息然后響應它。任何一個窗口類都有一個窗口過程。同一個類的窗口使用同樣的窗口過程來響應消息。窗口過程是一個回調函數(Callback Function),它是由Windows操作系統負責調用的,而應用程序本身不能調用它。消息的處理是由窗口過程完成的,窗口過程處理了一個消息后,通常要返回一個值給Windows。系統發送消息給窗口過程,通常將消息數據作為參數傳遞給它。消息到來之后,窗口過程按照消息類型的排序進行處理,其中的參數則用來區分不同的消息。同時,窗口過程使用參數產生合適行為。下面是一個典型窗口過程的偽代碼:

Windows的操作會產生大量的不同種類的消息,窗口過程函數不可能處理所有的消息,只處理需要的消息,其它的消息就交給系統處理。DefaultWndProc()就是系統提供的處理其它程序里沒有捕獲的消息。

3.4 Windows消息機制實現過程

Windows消息機制的具體實現過程,如圖1所示:

圖1 Windows消息機制

一個消息從產生到被一個窗口響應,主要有5個步驟:

(1)系統中發生了某個事件;

(2)Windows把這個事件翻譯為消息,把它放到系統消息隊列中,然后轉發到相應線程消息隊列里;

(3)應用程序從消息隊列中接收到這個消息,把它存放在TMsg記錄中;

(4)應用程序把消息傳遞給系統,系統調用適當的窗口過程;

(5)窗口過程響應這個消息并進行處理。

在Windows消息機制中,步驟3和4構成了應用程序的消息循環。消息循環使應用程序能夠響應外部的事件,所以,它是Windows應用程序的核心。消息循環的任務就是從消息隊列中檢索消息,然后把消息傳遞給適當的窗口。如果消息隊列中沒有消息,Windows就允許其它應用程序處理它們的消息。

4.結束語

消息機制是Windows應用程序工作的核心,利用各種開發工具在此平臺上進行開發,不可避免地要與消息處理打交道。本文從消息的結構、發送、處理介紹了Windows消息機制。對于一個編寫Windows程序的程序員來說,理解Windows消息機制的運行原理對于編寫Windows應用程序是十分有益的。

[1]陳希勝.基于WINDOWS下的DMA編程[J].科技廣場,2008,12:121.

[2]周金萍,徐丙立等.Windows系統編程[M].北京:人民郵電出版社,2002.7.

[3]王芳.Windows消息機制在VB編程中的應用[J].信息技術,2005(7):146.

[4]徐靜蓉,趙雷,楊季文.消息分層處理機制在Windows應用程序開發中的應用[J].蘇州大學學報(自然科學版),2006,22(1):61.

[5]張朝霞.MFC對消息的管理初探[J].內蒙古科技與經濟,2004(23):55.

[6]李元臣.Windows的消息循環與Delphi中的消息機制[J].洛陽師范學院學報,2001(2):74.

猜你喜歡
機制系統
Smartflower POP 一體式光伏系統
工業設計(2022年8期)2022-09-09 07:43:20
構建“不敢腐、不能腐、不想腐”機制的思考
WJ-700無人機系統
ZC系列無人機遙感系統
北京測繪(2020年12期)2020-12-29 01:33:58
基于PowerPC+FPGA顯示系統
半沸制皂系統(下)
自制力是一種很好的篩選機制
文苑(2018年21期)2018-11-09 01:23:06
連通與提升系統的最后一塊拼圖 Audiolab 傲立 M-DAC mini
定向培養 還需完善安置機制
中國衛生(2016年9期)2016-11-12 13:28:08
破除舊機制要分步推進
中國衛生(2015年9期)2015-11-10 03:11:12
主站蜘蛛池模板: 日本黄色不卡视频| 国产97公开成人免费视频| 国产96在线 | 色婷婷色丁香| 国产真实二区一区在线亚洲 | 国产波多野结衣中文在线播放| 亚洲精品制服丝袜二区| 欧美另类图片视频无弹跳第一页| 亚洲AV无码乱码在线观看裸奔| 18禁影院亚洲专区| 欧美精品啪啪| 色婷婷亚洲十月十月色天| 色哟哟色院91精品网站| 日本亚洲国产一区二区三区| 日韩免费中文字幕| 国产无码制服丝袜| 国产午夜福利在线小视频| 国产特级毛片aaaaaa| 免费毛片全部不收费的| 影音先锋丝袜制服| 26uuu国产精品视频| 国产又爽又黄无遮挡免费观看| 日韩无码视频专区| 五月天福利视频| 亚洲九九视频| 亚洲成人网在线播放| 国产亚洲精| 欧美另类图片视频无弹跳第一页| 九九九精品视频| 亚洲中文字幕23页在线| 精品人妻一区无码视频| 亚洲天堂啪啪| 国产91透明丝袜美腿在线| 国产精鲁鲁网在线视频| 成人国产精品视频频| 日韩在线永久免费播放| 日本国产一区在线观看| 欧美日韩动态图| 午夜国产在线观看| 91精品啪在线观看国产91| 麻豆国产在线观看一区二区 | 青青草原国产| 国内精自视频品线一二区| 黑人巨大精品欧美一区二区区| 欧美午夜在线观看| 91精品久久久无码中文字幕vr| 午夜久久影院| 中文无码精品A∨在线观看不卡| 国内精品免费| 精品国产中文一级毛片在线看| 浮力影院国产第一页| 日韩欧美中文在线| 国产精品久久久免费视频| 亚洲国产精品久久久久秋霞影院 | 久久综合色天堂av| 亚洲v日韩v欧美在线观看| 一级片一区| 欧美一级在线看| 91色老久久精品偷偷蜜臀| 国产在线视频导航| 色综合热无码热国产| 91精品专区国产盗摄| 亚洲综合色区在线播放2019| 国产精品久久国产精麻豆99网站| 欧美一级在线| 国产女人喷水视频| 亚洲乱码在线播放| 香蕉视频国产精品人| 久久天天躁狠狠躁夜夜躁| 手机在线国产精品| 91在线播放国产| 成人精品在线观看| 精品国产香蕉伊思人在线| 美女扒开下面流白浆在线试听 | AV网站中文| 免费99精品国产自在现线| 国产99视频精品免费视频7| 99在线视频免费| 国产JIZzJIzz视频全部免费| 日韩在线视频网| 欧美日韩在线国产| 狠狠五月天中文字幕|