Windows新聞傳遞機制詳解。本站提示廣大學習愛好者:(Windows新聞傳遞機制詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是Windows新聞傳遞機制詳解正文
關於windows法式設計,這裡有幾個症結詞須要留意:新聞,新聞輪回,窗口進程。
所謂的Windows新聞傳遞機制就相似於生涯中的物流公司。當寄件人(例如鼠標、鍵盤)將包裹(新聞)交給物流公司(Windows體系)時,物流公司(Windows體系)會停止整頓而且派發(整頓及派發重要由新聞輪回完成),交給響應的快遞員(窗口進程)來處置。快遞員(窗口進程)拿到包裹(新聞)後則有多種方法來處置,如立馬交給收件人,等一天交給收件人,或轉交給其他快遞派發,這就須要在窗口進程頂用swich/case來辨別。
新聞輪回:
現在始化完成後,WinMain主函數就進入新聞輪回:
While(GetMessage(&msg,...)) { TranslateMessage(&msg);//轉換鍵盤新聞 DispatchMessage(&msg);//分配新聞 }
窗口進程:
LRESULT CALLBACK WndProc(...) { ... switch( msg ) { case 1: ... case 2: ... Default: ... } return 0; }
上面以兩個成績的方法停止詳細概要。
成績1:新聞有哪幾種分類辦法?
(1) 隊列新聞和非隊列新聞
隊列新聞會被送到體系新聞隊列,然後到線程新聞隊列。Windows保護一個體系新聞隊列,每一個GUI線程也有一個線程新聞隊列。個中包含鍵盤鼠標新聞,WM_PAINT、WM_TIMER、WM_QUIT。
這些隊列新聞之外的新聞絕年夜多半都長短隊列新聞。
此處留意:新聞隊列中放置的新聞是以MSG構造的情勢存在,MSG包含:窗口句柄、新聞標識、新聞的兩個參數(WPARAM和LPARAM)、新聞發送(POST)的時光和鼠標的地位。另外,可以應用::GetMessage函數和::PeekMessage函數來保留取得的新聞信息。
非隊列新聞直接送給目標窗口進程。
(2) 體系新聞和運用法式新聞
體系新聞ID規模 0X8000~0XBFFF
運用法式消ID規模0XC000~0XFFFF
為了運用法式新聞的ID獨一性,可使用::RegisterWindowMessage來獲得特定的ID。
成績2:新聞是若何停止傳遞、吸收、處置的?
Windows運用法式的輸出由Windows體系以新聞的情勢發送給運用法式的窗口,這些窗口經由過程窗口進程來吸收和處置新聞,然後把掌握返還給Windows。
此處留意:非隊列新聞直接送給目標窗口的窗口進程,隊列新聞由::DispatchMessage派發給目標窗口的窗口進程。窗口進程被挪用時吸收四個參數:窗口句柄、新聞標識、兩個32位的新聞參數。在窗口進程裡,用switch/case分支處置語句來辨認和處置新聞。
每一個GDI運用法式在主窗口創立以後,都邑進入新聞輪回,接收用戶輸出、說明和處置新聞。新聞輪回從新聞隊列中獲得新聞,假如不是快捷鍵新聞或對話框新聞,就停止新聞轉換和派發,讓目標窗口的窗口進程來處置。當獲得新聞WM_QUIT,或許::GetMessage失足時,加入新聞輪回。