Windows消息機制的理解

一. 消息的概念

當(dāng)用戶單擊鼠標(biāo)、改變窗口大小或者按下鍵盤上的一個鍵等用戶動作時,會觸發(fā)點擊,按鍵等事件漱凝,而windows系統(tǒng)把這些事件轉(zhuǎn)化為特定的消息,并放置在應(yīng)用程序的消息列隊中(windows為當(dāng)前運行的每一個windows程序維護了一個消息列隊)等待應(yīng)用程序的處理诸迟,而應(yīng)用程序不斷從消息列隊中取出消息茸炒,并進(jìn)行響應(yīng)愕乎。所以說windows是基于消息的事件驅(qū)動模式。

二. 消息如何被處理壁公?(窗口過程)

按照一般寫程序的思維而言感论,我們希望傳給函數(shù)正確的參數(shù)來調(diào)用這個函數(shù)。而windows消息可以理解為指定了的函數(shù)的參數(shù)紊册,例如:用戶需要關(guān)閉某個窗口笛粘,點擊了右上角的X后,windows便把這個行為轉(zhuǎn)換為消息加入消息列隊湿硝,而這個消息可能包含了“需要關(guān)閉的是哪一個窗口(窗口句柄)”,“關(guān)閉窗口的信息”這樣的參數(shù)润努,應(yīng)用程序從消息列隊中讀取到了這個消息关斜,并把它交給“關(guān)閉窗口”這個函數(shù)來進(jìn)行處理,而這個函數(shù)就叫做“窗口過程”铺浇,這樣聽起來不好理解痢畜,可以加長的理解為“處理窗口消息的函數(shù)過程”。
  而如果沒有對應(yīng)的函數(shù)來處理這個消息呢鳍侣?例如丁稀,拖動窗口。為此倚聚,windows會用默認(rèn)的消息處理函數(shù)(DefWindowProc)來進(jìn)行處理.

三. 消息的組成

消息結(jié)構(gòu)體長這樣
  typedef struct tagMSG {  HWND hwnd; //消息句柄线衫,理解為窗口的唯一標(biāo)志   UINT message; //消息類型,分為windows消息和用戶自己定義的消息  WPARAM wParam; //消息附加參數(shù)  LPARAM lParam; //消息附加參數(shù)  DWORD time; //消息產(chǎn)生時間愛你   POINT pt; //消息被發(fā)送時的光標(biāo)位置   } MSG;

四. 消息發(fā)送的方式

1. 投遞消息PostMessage

異步執(zhí)行惑折,發(fā)送到消息列隊后立即返回?zé)o序等待授账。
應(yīng)用程序一般是投遞一個消息來通知指定窗口完成某個任務(wù)
BOOL PostMessage( HWND hWnd, //目標(biāo)窗口句柄 UINT Msg, //消息類型 WPARAM wParam, //第一個消息參數(shù) LPARAM lParam //第二個消息參數(shù) );

2. 發(fā)送消息 SendMessage

同步執(zhí)行,需要等到消息的返回碼之后在繼續(xù)惨驶。
基本上所有的輸入類消息白热,都是以投遞的方式抵達(dá)應(yīng)用的,而其他的消息粗卜,則大部分是采取了發(fā)送方式屋确。
LRESULT SendMessage( HWND hWnd, //接收消息的目標(biāo)窗口 UINT Msg, //消息類型 WPARAM wParam, //第一個消息參數(shù) LPARAM lParam //第二個消息參數(shù) );

五. 消息循環(huán)實例

while(GetMessage (&msg, NULL, 0, 0)) //消息循環(huán),不斷從消息列隊取出消息
{ 
TranslateMessage (&msg) ; //翻譯鍵盤消息
DispatchMessage (&msg) ; //把消息發(fā)送給窗口過程
}

//消息過程是一個CALLBACK回調(diào)函數(shù)续扔,每處理一個消息會返回一個值給windows

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)  
{  
    HDC         hdc;  
    PAINTSTRUCT ps;  
    RECT        rect;  
  
    switch (message)  
    {  
    case WM_CREATE:  
        PlaySound(TEXT("hello.wav"), NULL, SND_FILENAME | SND_ASYNC);  //窗口創(chuàng)建的時候播放音樂
        return 0;  
  
    case WM_DESTROY:  
        PostQuitMessage(0);  //把退出窗口的消息插入消息列隊
        return 0;  
    }  
  
    return DefWindowProc(hwnd, message, wParam, lParam);  //默認(rèn)的消息處理函數(shù)
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末攻臀,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子纱昧,更是在濱河造成了極大的恐慌茵烈,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件砌些,死亡現(xiàn)場離奇詭異呜投,居然都是意外死亡加匈,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進(jìn)店門仑荐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來雕拼,“玉大人,你說我怎么就攤上這事粘招∩犊埽” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵洒扎,是天一觀的道長辑甜。 經(jīng)常有香客問我,道長袍冷,這世上最難降的妖魔是什么磷醋? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮胡诗,結(jié)果婚禮上邓线,老公的妹妹穿的比我還像新娘。我一直安慰自己煌恢,他們只是感情好骇陈,可當(dāng)我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著瑰抵,像睡著了一般你雌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上二汛,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天匪蝙,我揣著相機與錄音,去河邊找鬼习贫。 笑死逛球,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的苫昌。 我是一名探鬼主播颤绕,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼祟身!你這毒婦竟也來了奥务?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤袜硫,失蹤者是張志新(化名)和其女友劉穎氯葬,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體婉陷,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡帚称,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年官研,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片闯睹。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡戏羽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出楼吃,到底是詐尸還是另有隱情始花,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布孩锡,位于F島的核電站酷宵,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏躬窜。R本人自食惡果不足惜浇垦,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望斩披。 院中可真熱鬧,春花似錦讹俊、人聲如沸垦沉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽厕倍。三九已至,卻和暖如春贩疙,著一層夾襖步出監(jiān)牢的瞬間讹弯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工这溅, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留组民,地道東北人。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓悲靴,卻偏偏與公主長得像臭胜,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子癞尚,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,490評論 2 348

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