Windows消息機(jī)制

消息結(jié)構(gòu)體

typedef struct tagMSG
{
    HWND hwnd;      //窗口句柄蛾坯。
    UINT message;   //消息類型。
    WPARAM wParam;  //32位附加信息挂疆。
    LPARAM lParam;  //32位附加信息下翎。
    DWORD time;     //消息發(fā)送時(shí)間。
    POINT pt;       //消息發(fā)送時(shí)胆萧,鼠標(biāo)所在位置俐东。
} MSG; 

消息隊(duì)列

消息隊(duì)列有兩種虏辫,分為系統(tǒng)消息隊(duì)列和應(yīng)用程序消息隊(duì)列。產(chǎn)生的消息首先由Windows系統(tǒng)捕獲羹唠,放在系統(tǒng)消息隊(duì)列娄昆,再拷貝到對(duì)應(yīng)的應(yīng)用程序消息隊(duì)列。

消息循環(huán)

消息循環(huán)會(huì)不斷檢索自身的消息隊(duì)列哺眯。每有一個(gè)消息扒俯,就用GetMessage()取出消息一疯。

while(GetMessage (&msg, NULL, 0, 0)) //Windows消息循環(huán)。
{
    TranslateMessage(&msg); //翻譯消息互纯,如按鍵消息留潦,翻譯為WM_CHAR
    DispatchMessage(&msg);  //分發(fā)消息到對(duì)應(yīng)窗口
}

當(dāng)用戶運(yùn)行一個(gè)應(yīng)用程序,通過對(duì)鼠標(biāo)的點(diǎn)擊或鍵盤按鍵殖卑,產(chǎn)生一些特定事件坊萝。由于Windows一直監(jiān)控著I/O設(shè)備,該事件首先會(huì)被翻譯成消息菩鲜,由系統(tǒng)捕獲惦积,存放于系統(tǒng)消息隊(duì)列狮崩。經(jīng)分析,Windows知道該消息應(yīng)由那個(gè)應(yīng)用程序處理诽凌,則拷貝到相應(yīng)的應(yīng)用程序消息隊(duì)列坦敌。由于消息循環(huán)不斷檢索自身的消息隊(duì)列恬试,當(dāng)發(fā)現(xiàn)應(yīng)用程序消息隊(duì)列里有消息,就用GetMessage()取出消息训柴,封裝成Msg()結(jié)構(gòu)幻馁。如果該消息是由鍵盤按鍵產(chǎn)生的越锈,用TranslateMessage()翻譯為WM_CHAR消息膘滨,否則火邓,用DisPatchMessage()將取出的消息分發(fā)到相應(yīng)的應(yīng)用程序窗口,交由窗口處理程序處理躲胳。Windows為每個(gè)窗體預(yù)留了過程窗口函數(shù)纤勒,該函數(shù)是一個(gè)回掉函數(shù),由系統(tǒng)調(diào)用粹湃,應(yīng)用程序不能調(diào)用泉坐。程序員可以通過重載該函數(shù)處理我們”感興趣”的消息坚冀。對(duì)于不感興趣的消息,則由系統(tǒng)默認(rèn)的窗口過程處理程序做出處理司训。

windows消息循環(huán)的詳細(xì)過程:
  1. 我們創(chuàng)建完win32應(yīng)用程序液南,當(dāng)用戶通過對(duì)鼠標(biāo),鍵盤操作應(yīng)用程序時(shí)统扳,由于Windows一直監(jiān)控著I/O設(shè)備咒钟,該事件首先會(huì)被轉(zhuǎn)化成消息若未,由windows系統(tǒng)捕獲,存放于系統(tǒng)消息隊(duì)列萍嬉。
  2. Windows系統(tǒng)知道該消息應(yīng)由哪個(gè)應(yīng)用程序處理,然后拷貝到相應(yīng)的應(yīng)用程序消息隊(duì)列磕道。同時(shí)將該消息從系統(tǒng)消息隊(duì)列中刪除溺蕉。
  3. 應(yīng)用程序的消息循環(huán)不斷在執(zhí)行资柔,此時(shí)撵割,調(diào)用GetMessage()從消息隊(duì)列中查找消息,發(fā)現(xiàn)了該消息羹与,GetMessage()將返回一個(gè)正值庶灿,并獲取到了該消息Msg往踢;PS:如果消息隊(duì)列為空峻呕,程序?qū)⑼V箞?zhí)行并等待(程序阻塞)。
  4. 然后取出消息(Msg)并將其傳遞給TranslateMessage()函數(shù),這個(gè)函數(shù)做一些額外的處理:將虛擬鍵值信息轉(zhuǎn)換為字符信息热押。這一步實(shí)際上是可選的桶癣,但有些地方需要用到這一步鬼廓。
  5. 上面的步驟執(zhí)行完后致盟,將消息MSG傳遞給DispatchMessage()函數(shù)碎税。DispatchMessage()函數(shù)將消息再給windows系統(tǒng),由windows系統(tǒng)找到目標(biāo)窗口并分發(fā)給該窗口伟端,調(diào)用消息對(duì)應(yīng)的窗口過程函數(shù),既窗口的WinPro函數(shù)匪煌,讓W(xué)inPro函數(shù)處理责蝠。WinPro函數(shù)可以允許我們對(duì)不同的消息做特定的處理,若不處理的話萎庭,則會(huì)調(diào)用DefWindowProc函數(shù),做默認(rèn)處理驳规,所以為什么默認(rèn)代碼中WinPro的類型是CallBack(回調(diào)),因?yàn)椴皇俏覀冎鲃?dòng)調(diào)用的吗购,是系統(tǒng)回調(diào)的
  6. 一旦一個(gè)消息處理完成,窗口過程WinPro函數(shù)返回,DispatchMessage()函數(shù)返回踱启,應(yīng)用程序的消息循環(huán)繼續(xù)while循環(huán),Window系統(tǒng)繼續(xù)監(jiān)控各類消息埠偿,重復(fù)上述步驟

參考:Windows消息循環(huán)機(jī)制

定時(shí)器消息

Windows定時(shí)器的使用說明

模態(tài)對(duì)話框?qū)崿F(xiàn)原理

對(duì)話框接收了應(yīng)用的消息循環(huán)胚想。
MFC 模態(tài)對(duì)話框的實(shí)現(xiàn)原理
自實(shí)現(xiàn)一個(gè)模態(tài)對(duì)話框。

QT消息循環(huán)機(jī)制

參考: [https://zhuanlan.zhihu.com/p/113695485]

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末浊服,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子愁憔,更是在濱河造成了極大的恐慌孽拷,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件膜宋,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡秋茫,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門圆兵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來枢贿,“玉大人,你說我怎么就攤上這事局荚。” “怎么了聪建?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵茫陆,是天一觀的道長(zhǎng)擎析。 經(jīng)常有香客問我,道長(zhǎng)揍魂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任喜最,我火速辦了婚禮,結(jié)果婚禮上庄蹋,老公的妹妹穿的比我還像新娘。我一直安慰自己虫蝶,他們只是感情好倦西,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著粉铐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蝙泼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天倡缠,我揣著相機(jī)與錄音茎活,去河邊找鬼。 笑死载荔,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的懒熙。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼徘钥,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼肢娘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起橱健,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤拘荡,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后珊皿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡途凫,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年溢吻,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了果元。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片犀盟。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖倡怎,靈堂內(nèi)的尸體忽然破棺而出贱枣,到底是詐尸還是另有隱情监署,我是刑警寧澤纽哥,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布春塌,位于F島的核電站晓避,受9級(jí)特大地震影響只壳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜吼句,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望命辖。 院中可真熱鬧分蓖,春花似錦、人聲如沸么鹤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽柠新。三九已至,卻和暖如春恨憎,著一層夾襖步出監(jiān)牢的瞬間蕊退,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來泰國打工净蚤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留输硝,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓点把,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親砾医。 傳聞我的和親對(duì)象是個(gè)殘疾皇子衣厘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容