WINDOWS消息機制(二):從消息產生到被處理的完整流程

主要內容:該篇文章主要描述在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. 操做系統如何爲應用程序線程建立消息隊列,如何體現?

相關文章
相關標籤/搜索