• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            春暖花開
            雪化了,花開了,春天來了
            posts - 149,comments - 125,trackbacks - 0

            Windows 消息機(jī)制

            編寫Windows程序有兩年了,但當(dāng)別人問起Windows消息機(jī)制總覺得很難形容清楚。在這篇中,集合了很多我從網(wǎng)絡(luò)中搜集來的一些知識,這里只是匯總一下。

            我們編寫的Windows程序是以事件為驅(qū)動,消息機(jī)制為基礎(chǔ)的。對于每一個正在執(zhí)行的Windows應(yīng)用程序,Windows為其建立一個消息隊(duì)列,即應(yīng)用程序隊(duì)列,用來存放該程序可能創(chuàng)建的各種窗口的消息。應(yīng)用程序中含有一段稱作消息循環(huán)的代碼,用來從消息隊(duì)列中檢索這些消息并把它們分發(fā)到相應(yīng)的窗口函數(shù)中。

            一、消息循環(huán)

            首先我們來看一下Windows消息循環(huán)。

            while(GetMessage (&msg, NULL, 0, 0))       
            {        
                TranslateMessage (&msg) ;        
                DispatchMessage (&msg) ;       
            }

            MSG結(jié)構(gòu)在頭文件中定義如下:

              typedef struct tagMSG

              {

              HWND hwnd;

              UINT message;

              WPARAM wParam;

              LPARAM lParam;

              DWORD time;

              POINT pt;

              } MSG, *PMSG;

              

            其數(shù)據(jù)成員的具體意義如下:

            hwnd:消息將要發(fā)送到的那個窗口的句柄,用這個參數(shù)可以決定讓哪個窗口接收消息。

            message:消息號,它唯一標(biāo)識了一種消息類型。每種消息類型都在Windows文件進(jìn)行了預(yù)定義。

            wParam:一個32位的消息參數(shù),這個值的確切意義取決于消息本身。

            lParam:同上。

            time:消息放入消息隊(duì)列中的時間,在這個域中寫入的并非當(dāng)時日期,而是從Windows啟動后所測量的時間值。Windows用這個域來使用消息保持正確的順序。

            pt:消息放入消息隊(duì)列時的鼠標(biāo)坐標(biāo)。

            消息循環(huán)以GetMessage調(diào)用開始,它從消息隊(duì)列中取出一個消息。然后解釋和分發(fā)消息。

            二、消息類型

            消息主要分為兩種:一是系統(tǒng)定義消息;二是自定義消息。

            1、系統(tǒng)定義消息(System-Defined Messages)

            SDK中事先定義好的消息,非用戶定義的,其范圍在[0x0000, 0x03ff]之間, 可以分為以下三類:
            1>
            窗口消息(Windows Message)
            與窗口的內(nèi)部運(yùn)作有關(guān),如創(chuàng)建窗口,繪制窗口,銷毀窗口等。可以是一般的窗口,也可以是Dialog,控件等。
            如:WM_CREATE, WM_PAINT, WM_MOUSEMOVE, WM_CTLCOLOR, WM_HSCROLL...
            2>
            命令消息(Command Message)
            與處理用戶請求有關(guān), 如單擊菜單項(xiàng)或工具欄或控件時, 就會產(chǎn)生命令消息。
            WM_COMMAND, LOWORD(wParam)
            表示菜單項(xiàng),工具欄按鈕或控件的ID。如果是控件, HIWORD(wParam)表示控件消息類型
            3>
            控件通知(Notify Message)
            控件通知消息, 這是最靈活的消息格式, Message, wParam, lParam分別為:WM_NOTIFY, 控件ID,指向NMHDR的指針。NMHDR包含控件通知的內(nèi)容, 可以任意擴(kuò)展。

            2 程序定義消息(Application-Defined Messages)
            用戶自定義的消息, 對于其范圍有如下規(guī)定:
            WM_USER: 0x0400-0x7FFF    (ex. WM_USER+10)
            WM_APP(winver>4.0): 0x8000-0xBFFF (ex.WM_APP+4)
            RegisterWindowMessage: 0xC000-0xFFFF

             

            三、隊(duì)列化消息和非隊(duì)列化消息

            消息被分成隊(duì)列化消息和非隊(duì)列化消息。

            隊(duì)列化消息是由Windows放入程序消息隊(duì)列中的。在程序的消息循環(huán)中,重新傳回并分配給窗口消息處理程序。非隊(duì)列化消息是在Windows的窗口過程中直接發(fā)送給窗口的消息處理程序。簡單的說,隊(duì)列化的消息被發(fā)送給消息隊(duì)列,而非隊(duì)列化的消息則發(fā)送給窗口消息處理程序。在任何情況下,窗口消息處理程序都將獲得窗口的所有消息——包括隊(duì)列化的和非隊(duì)列化的。窗口消息處理程序是窗口的消息中心。隊(duì)列化消息基本上是使用者輸入的結(jié)果,如WM_KEYDOWNWM_KEYUPWM_CHARWM_MOUSEMOVEWM_LBUTTONDOWN WM_TIMERWM_PAINTWM_QUIT。非隊(duì)列化消息則是其他消息。在許多情況下,非隊(duì)列化的消息來自呼叫特定的windows函數(shù)。

            四、SendMessagePostMessage的區(qū)別

            SendMessagePostMessage是在編程過程中使用頻率較高的兩個函數(shù)。

            SendMessage是同步的操作,它將消息發(fā)送給窗口,除非消息處理完畢,否則該函數(shù)不會返回。其返回值表示其他程序處理消息后的返回值。

            PostMessage是異步的操作,將一個消息放到與指定窗口創(chuàng)建的線程相關(guān)的消息隊(duì)列中,不等線程處理消息就返回。其返回值表示PostMessage是否執(zhí)行成功。

            五、GetMessagePeekMessage的區(qū)別

            區(qū)別一:

            peekmessage不管消息隊(duì)列里有沒有消息都會馬上返回,有消息返回消息,沒消息返回空值,

            getmessage等待到有消息的時候才返回,

            區(qū)別二:

            peekmessage可以根據(jù)參數(shù)決定是否將消息保留在隊(duì)列中,

            PM_NOREMOVE:該參數(shù)指示保留消息

            PM_REMOVE:該參數(shù)指示移去消息

            getmessage獲得消息后回把消息從消息隊(duì)列中刪去。

            PeekMessage是一個異步的操作,而GetMessage則是一個同步的操作。

            六、TranslateMessage

            功能描述:將虛擬鍵消息轉(zhuǎn)換為字符消息。字符消息被送到調(diào)用線程的消息隊(duì)列中,在下一次線程調(diào)用函數(shù)GetMessagePeekMessage時被讀出。

            返回值:

             如果消息被轉(zhuǎn)換(即,字符消息被送到線程的消息隊(duì)列中),返回非零值。

            如果消息是 WM_KEYDOWN, WM_KEYUP, WM_SYSKEYDOWN, WM_SYSKEYUP,返回非零值,不考慮轉(zhuǎn)換。

            如果消息沒有轉(zhuǎn)換(即,字符消息沒被送到線程的消息隊(duì)列中),返回值是零。

            備注:

            TranslateMessage函數(shù)不修改由參數(shù)lpMsg指向的消息。

            TtanslateMessage僅為那些由鍵盤驅(qū)動器映射為ASCII字符的鍵產(chǎn)生WM_CHAR消息。

            如果應(yīng)用程序?yàn)槠渌猛径幚硖摂M鍵消息,不應(yīng)調(diào)用TranslateMessage函數(shù)。例如,如果TranslateAccelerator函數(shù)返回一個非零值,則應(yīng)用程序?qū)⒉徽{(diào)用TranslateMessage函數(shù)。

            Windows CEWindows CE不支持掃描碼或擴(kuò)展鍵標(biāo)志,因此,它不支持由TranslateMessage函數(shù)產(chǎn)生的WM_CHAR消息中的lKeyData參數(shù)(lParam16-24的取值。

            TranslateMessage函數(shù)只能用于轉(zhuǎn)換由GetMessagePeekMessage函數(shù)接收到的消息。


            出處沒有記載,簡單匯總 

            posted on 2009-04-29 08:02 Sandy 閱讀(881) 評論(0)  編輯 收藏 引用 所屬分類: Windows Mobile
            亚洲AV日韩AV天堂久久| 一本久道久久综合狠狠爱| 亚洲女久久久噜噜噜熟女| 99久久婷婷国产一区二区| 久久久久免费精品国产| 国产精品99久久不卡| www亚洲欲色成人久久精品| 欧美一区二区三区久久综| 久久精品人人做人人爽97 | 午夜精品久久久久9999高清| 久久福利片| 久久经典免费视频| 亚洲精品tv久久久久久久久| 久久天天躁狠狠躁夜夜2020一| 国产国产成人精品久久| 99久久综合狠狠综合久久| 久久精品国产91久久综合麻豆自制 | 色综合久久中文色婷婷| 2021少妇久久久久久久久久| 国产精品久久网| 精品精品国产自在久久高清| 一级做a爱片久久毛片| 青草久久久国产线免观| 少妇熟女久久综合网色欲| 久久亚洲精品中文字幕三区| 久久久精品免费国产四虎| 亚洲国产精品久久久久网站 | 久久久久国色AV免费观看| 一本一道久久综合狠狠老| 国产三级久久久精品麻豆三级| 久久久久香蕉视频| 久久午夜夜伦鲁鲁片免费无码影视| 国产成人精品久久| 久久精品国产亚洲一区二区| 九九久久精品无码专区| 久久人人爽人人爽人人片AV东京热| 久久精品国产99久久无毒不卡| 国产国产成人久久精品| 久久精品国产2020| 国产精品久久久久久久午夜片| 国产精品久久久久久久久软件 |