Windows消息傳遞機制詳解
對于windows程序設計,這里有幾個關鍵詞需要注意:消息,消息循環(huán),窗口過程。
所謂的Windows消息傳遞機制就類似于生活中的物流公司。當寄件人(例如鼠標、鍵盤)將包裹(消息)交給物流公司(Windows系統(tǒng))時,物流公司(Windows系統(tǒng))會進行整理并且派發(fā)(整理及派發(fā)主要由消息循環(huán)完成),交給相應的快遞員(窗口過程)來處理。快遞員(窗口過程)拿到包裹(消息)后則有多種方式來處理,如立馬交給收件人,等一天交給收件人,或轉交給其他快遞派發(fā),這就需要在窗口過程中用swich/case來區(qū)分。
消息循環(huán):
當初始化完成后,WinMain主函數(shù)就進入消息循環(huán):
While(GetMessage(&msg,...)) { TranslateMessage(&msg);//轉換鍵盤消息 DispatchMessage(&msg);//分派消息 }
窗口過程:
LRESULT CALLBACK WndProc(...) { ... switch( msg ) { case 1: ... case 2: ... Default: ... } return 0; }
下面以兩個問題的方式進行具體概要。
問題1:消息有哪幾種分類方法?
(1) 隊列消息和非隊列消息
隊列消息會被送到系統(tǒng)消息隊列,然后到線程消息隊列。Windows維護一個系統(tǒng)消息隊列,每個GUI線程也有一個線程消息隊列。其中包括鍵盤鼠標消息,WM_PAINT、WM_TIMER、WM_QUIT。
這些隊列消息以外的消息絕大多數(shù)都是非隊列消息。
此處注意:消息隊列中放置的消息是以MSG結構的形式存在,MSG包括:窗口句柄、消息標識、消息的兩個參數(shù)(WPARAM和LPARAM)、消息發(fā)送(POST)的時間以及鼠標的位置。此外,可以利用::GetMessage函數(shù)和::PeekMessage函數(shù)來保存獲得的消息信息。
非隊列消息直接送給目的窗口過程。
(2) 系統(tǒng)消息和應用程序消息
系統(tǒng)消息ID范圍 0X8000~0XBFFF
應用程序消ID范圍0XC000~0XFFFF
為了應用程序消息的ID唯一性,可以使用::RegisterWindowMessage來得到特定的ID。
問題2:消息是如何進行傳遞、接收、處理的?
Windows應用程序的輸入由Windows系統(tǒng)以消息的形式發(fā)送給應用程序的窗口,這些窗口通過窗口過程來接收和處理消息,然后把控制返還給Windows。
此處注意:非隊列消息直接送給目的窗口的窗口過程,隊列消息由::DispatchMessage派發(fā)給目的窗口的窗口過程。窗口過程被調用時接收四個參數(shù):窗口句柄、消息標識、兩個32位的消息參數(shù)。在窗口過程里,用switch/case分支處理語句來識別和處理消息。
每個GDI應用程序在主窗口創(chuàng)建之后,都會進入消息循環(huán),接受用戶輸入、解釋和處理消息。消息循環(huán)從消息隊列中得到消息,如果不是快捷鍵消息或對話框消息,就進行消息轉換和派發(fā),讓目的窗口的窗口過程來處理。當?shù)玫较M_QUIT,或者::GetMessage出錯時,退出消息循環(huán)。
相關文章
C語言全面細致講解單雙精度float與double的使用方法
C語言中小數(shù)的數(shù)據(jù)類型為 float 或 double:float 稱為單精度浮點數(shù),double 稱為雙精度浮點數(shù)。不像整數(shù),小數(shù)的長度始終是固定的,float 占用4個字節(jié),double 占用8個字節(jié)2022-05-05C++11中value category(值類別)及move semantics(移動語義)的介紹
這篇文章主要給大家介紹了C++11中value category(值類別)及move semantics(移動語義)的介紹,文中介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2018-05-05C語言中strlen() strcpy() strcat() strcmp()函數(shù)的實現(xiàn)方法
這篇文章主要介紹了C語言中strlen() strcpy() strcat() strcmp()函數(shù)的實現(xiàn)方法,需要的朋友可以參考下2017-08-08C++實現(xiàn)LeetCode(121.買賣股票的最佳時間)
這篇文章主要介紹了C++實現(xiàn)LeetCode(121.買賣股票的最佳時間),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下2021-07-07