主要內容:該篇文章主要描述在WINDOWS應用程序中,消息從產生到被處理的完整流程,此處以界面某一個控件被點擊的總體流程爲例,說明消息的流動及處理過程(此處消息屬於輸入消息)函數
1. 鼠標點擊,產生單擊事件,鼠標設備驅動程序根據用戶事件,轉換成消息,並放置於WINDOWS的系統隊列中spa
2. WINDOWS將系統隊列中的消息取出,並投擲於消息對應的應用程序所屬的線程隊列。操作系統
3. 每一個應用程序在建立時,系統都會爲其建立一個消息隊列,發送給應用程序的消息都存放在該消息隊列中,等待被處理。 而應用程序的消息引擎線程
MSG msg; while(GetMessage(msg, NULL, NULL, NULL)) { TranslateMessage(&msg); DispatchMessage(&msg); }
會不停的從本身的專屬消息隊列中獲取消息,並進行消息的翻譯和轉發(TranslateMessage和DiapatchMessage)翻譯
GetMessage:從線程隊列中取消息,取出後對應的消息會從隊列中刪除;若無消息,則阻塞code
TranslateMessage:
把鍵盤消息轉換成對應的ASCII字符內存,並從新放置於隊列中,等待取出對象
DispatchMessage:
在註冊窗口對象時,有以下代碼:及設置對口的消息處理回調函數
隊列
WNDCLASS wc; ...... wc.lpfnWndProc = (WNDPROC)WndProc; ......
在窗口類的定義中,有以下代碼:
DECLARE_MESSAGE_MAP() ...... BEGIN_MESSAGE_MAP(CMsgTestDlg, CDialog) ...... ON_MESSAGE(WM_USER_SEND_MSG, &CMsgTestDlg::HandleSendMsg) ON_MESSAGE(WM_USER_POST_MSG, &CMsgTestDlg::HandlePostMsg) ...... END_MESSAGE_MAP()
該段代碼,是的全部該類型的對話框對象共享一個消息MAP表,DispatchMessage會根據消息所屬的窗口,調用回調函數WndProc,而WndProc則getMessageMap,根據消息類型,在map中進行匹配查找,找到對應的處理函數,並調用,則消息處理完畢。
鼠標點擊事件產生至處理的完整流程圖事件
問題:內存
1. 驅動程序如何捕捉事件,轉換成消息並將其放置於系統隊列中
2. 系統隊列如何將消息投擲於其對應的線程隊列中
3. 操做系統如何爲應用程序線程建立消息隊列,如何體現?