Windows消息傳遞機(jī)制詳解
對于windows程序設(shè)計(jì),這里有幾個(gè)關(guān)鍵詞需要注意:消息,消息循環(huán),窗口過程。
所謂的Windows消息傳遞機(jī)制就類似于生活中的物流公司。當(dāng)寄件人(例如鼠標(biāo)、鍵盤)將包裹(消息)交給物流公司(Windows系統(tǒng))時(shí),物流公司(Windows系統(tǒng))會進(jìn)行整理并且派發(fā)(整理及派發(fā)主要由消息循環(huán)完成),交給相應(yīng)的快遞員(窗口過程)來處理??爝f員(窗口過程)拿到包裹(消息)后則有多種方式來處理,如立馬交給收件人,等一天交給收件人,或轉(zhuǎn)交給其他快遞派發(fā),這就需要在窗口過程中用swich/case來區(qū)分。
消息循環(huán):
當(dāng)初始化完成后,WinMain主函數(shù)就進(jìn)入消息循環(huán):
While(GetMessage(&msg,...)) { TranslateMessage(&msg);//轉(zhuǎn)換鍵盤消息 DispatchMessage(&msg);//分派消息 }
窗口過程:
LRESULT CALLBACK WndProc(...) { ... switch( msg ) { case 1: ... case 2: ... Default: ... } return 0; }
下面以兩個(gè)問題的方式進(jìn)行具體概要。
問題1:消息有哪幾種分類方法?
(1) 隊(duì)列消息和非隊(duì)列消息
隊(duì)列消息會被送到系統(tǒng)消息隊(duì)列,然后到線程消息隊(duì)列。Windows維護(hù)一個(gè)系統(tǒng)消息隊(duì)列,每個(gè)GUI線程也有一個(gè)線程消息隊(duì)列。其中包括鍵盤鼠標(biāo)消息,WM_PAINT、WM_TIMER、WM_QUIT。
這些隊(duì)列消息以外的消息絕大多數(shù)都是非隊(duì)列消息。
此處注意:消息隊(duì)列中放置的消息是以MSG結(jié)構(gòu)的形式存在,MSG包括:窗口句柄、消息標(biāo)識、消息的兩個(gè)參數(shù)(WPARAM和LPARAM)、消息發(fā)送(POST)的時(shí)間以及鼠標(biāo)的位置。此外,可以利用::GetMessage函數(shù)和::PeekMessage函數(shù)來保存獲得的消息信息。
非隊(duì)列消息直接送給目的窗口過程。
(2) 系統(tǒng)消息和應(yīng)用程序消息
系統(tǒng)消息ID范圍 0X8000~0XBFFF
應(yīng)用程序消ID范圍0XC000~0XFFFF
為了應(yīng)用程序消息的ID唯一性,可以使用::RegisterWindowMessage來得到特定的ID。
問題2:消息是如何進(jìn)行傳遞、接收、處理的?
Windows應(yīng)用程序的輸入由Windows系統(tǒng)以消息的形式發(fā)送給應(yīng)用程序的窗口,這些窗口通過窗口過程來接收和處理消息,然后把控制返還給Windows。
此處注意:非隊(duì)列消息直接送給目的窗口的窗口過程,隊(duì)列消息由::DispatchMessage派發(fā)給目的窗口的窗口過程。窗口過程被調(diào)用時(shí)接收四個(gè)參數(shù):窗口句柄、消息標(biāo)識、兩個(gè)32位的消息參數(shù)。在窗口過程里,用switch/case分支處理語句來識別和處理消息。
每個(gè)GDI應(yīng)用程序在主窗口創(chuàng)建之后,都會進(jìn)入消息循環(huán),接受用戶輸入、解釋和處理消息。消息循環(huán)從消息隊(duì)列中得到消息,如果不是快捷鍵消息或?qū)υ捒蛳?,就進(jìn)行消息轉(zhuǎn)換和派發(fā),讓目的窗口的窗口過程來處理。當(dāng)?shù)玫较M_QUIT,或者::GetMessage出錯(cuò)時(shí),退出消息循環(huán)。
上一篇:VC實(shí)現(xiàn)動態(tài)菜單的創(chuàng)建方法
欄 目:C語言
下一篇:C++實(shí)現(xiàn)的泛型List類分享
本文標(biāo)題:Windows消息傳遞機(jī)制詳解
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/3607.html
您可能感興趣的文章
- 01-10進(jìn)程間通信之深入消息隊(duì)列的詳解
- 01-10淺析c/c++中函數(shù)的參數(shù)傳遞
- 01-10C++指針作為函數(shù)的參數(shù)進(jìn)行傳遞時(shí)需要注意的一些問題
- 01-10c文件匯編后函數(shù)參數(shù)傳遞的不同之處
- 01-10實(shí)現(xiàn)posix消息隊(duì)列示例分享
- 01-10win32 api實(shí)現(xiàn)簡單的消息窗口示例
- 01-10mingw編譯的windows命令行貪吃蛇示例
- 01-10c++利用windows函數(shù)實(shí)現(xiàn)計(jì)時(shí)示例
- 01-10c++傳遞函數(shù)指針和bind的示例
- 01-10MFC實(shí)現(xiàn)全屏功能代碼實(shí)例


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達(dá)式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機(jī)閱讀
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10C#中split用法實(shí)例總結(jié)
- 01-10delphi制作wav文件的方法
- 04-02jquery與jsp,用jquery
- 08-05織夢dedecms什么時(shí)候用欄目交叉功能?
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文