1. 程式人生 > >windows訊息機制

windows訊息機制

一 Windows中有一個系統訊息佇列,對於每一個正在執行的Windows應用程式,系統為其建立一個“訊息佇列”,即應用程式佇列,用來存放該程式可能 建立的各種視窗的訊息。應用程式中含有一段稱作“訊息迴圈”的程式碼,用來從訊息佇列中檢索這些訊息並把它們分發到相應的視窗函式中。

o_windowsmessage2.jpg

二 Windows為當前執行的每個Windows程式維護一個「訊息佇列」。在發生輸入事件之後,Windows將事件轉換為一個「訊息」並將訊息放入程式的訊息佇列中。程式通過執行一塊稱之為「訊息迴圈」的程式程式碼從訊息佇列中取出訊息:
while(GetMessage (&msg, NULL, 0, 0))       
{        
    TranslateMessage (&msg) ;        
    DispatchMessage (&msg) ;       
}

msg變數是型態為MSG的結構,型態MSG在WINUSER.H中定義如下:
typedef struct tagMSG       
{       
    HWND   hwnd ;        
    UINT   message ;        
    WPARAM wParam ;        
    LPARAM lParam ;        
    DWORD time ;        
    POINT pt ;       
}       
MSG, * PMSG ;
      
POINT資料型態也是一個結構,它在WINDEF.H中定義如下:
typedef struct tagPOINT       
{       
    LONG x ;       
    LONG y ;       
}       
POINT, * PPOINT;
TranslateMessage(&msg); 將msg結構傳給Windows,進行一些鍵盤轉換。(關於這一點,我們將在第六章中深入討論。)
DispatchMessage (&msg);又將msg結構回傳給Windows。然後,Windows將該訊息傳送給適當的視窗訊息處理程式,讓它進行處理。這也就是說, Windows將呼叫視窗訊息處理程式。在HELLOWIN中,這個視窗訊息處理程式就是WndProc函式。處理完訊息之後,WndProc傳回到 Windows。此時,Windows還停留在DispatchMessage呼叫中。在結束DispatchMessage呼叫的處理之後, Windows回到HELLOWIN程式中,並且接著從下一個GetMessage呼叫開始訊息迴圈。
        
三 佇列化訊息與非佇列化訊息
    
消 息能夠被分為「佇列化的」和「非佇列化的」。佇列化的訊息是由Windows放入程式訊息佇列中的。在程式的訊息迴圈中,重新傳回並分配給視窗訊息處理程 序。非佇列化的訊息在Windows呼叫視窗時直接送給視窗訊息處理程式。也就是說,佇列化的訊息被「傳送」給訊息佇列,而非佇列化的訊息則「傳送」給窗 口訊息處理程式。任何情況下,視窗訊息處理程式都將獲得視窗所有的訊息--包括佇列化的和非佇列化的。視窗訊息處理程式是視窗的「訊息中心」。

隊 列化訊息基本上是使用者輸入的結果,以擊鍵(如WM_KEYDOWN和WM_KEYUP訊息)、擊鍵產生的字元(WM_CHAR)、滑鼠移動 (WM_MOUSEMOVE)和滑鼠按鈕(WM_LBUTTONDOWN)的形式給出。佇列化訊息還包含時鐘訊息(WM_TIMER)、更新訊息 (WM_PAINT)和退出訊息(WM_QUIT)。

非佇列化訊息則是其它訊息。在許多情況下,非佇列化訊息來自呼叫特定的 Windows函式。例如,當WinMain呼叫CreateWindow時,Windows將建立視窗並在處理中給視窗訊息處理程式傳送一個 WM_CREATE訊息。當WinMain呼叫ShowWindow時,Windows將給視窗訊息處理程式傳送WM_SIZE和 WM_SHOWWINDOW訊息。當WinMain呼叫UpdateWindow時,Windows將給視窗訊息處理程式傳送WM_PAINT訊息。鍵盤 或滑鼠輸入時發出的佇列化訊息訊號,也能在非佇列化訊息中出現。例如,用鍵盤或滑鼠選擇了一個選單項時,鍵盤或滑鼠訊息就是佇列化的,而說明選單項已選中 的WM_COMMAND訊息則可能就是非佇列化的。

四 SendMessage()與PostMessage()之間的區別是什麼?
它們兩者是用於嚮應用程式傳送訊息的。PostMessagex()將訊息直接加入到應用程式的訊息佇列中,不等程式返回就退出;而SendMessage()則剛好相反,應用程式處理完此訊息後,它才返回。我想下圖能夠比較好的體現這兩個函式的關係:

o_postmessage.gif


五 函式peekmessage和getmessage的區別?

兩個函式主要有以下兩個區別:
1.GetMessage將等到有合適的訊息時才返回,而PeekMessage只是撇一下訊息佇列。
2.GetMessage會將訊息從佇列中刪除,而PeekMessage可以設定最後一個引數wRemoveMsg來決定是否將訊息保留在佇列中。

相關推薦

學習筆記10.4----Windows訊息機制

1)作業系統訊息機制:百度百科——訊息機制 解釋的很清楚。作業系統掃描輸入裝置狀態-(轉換為訊息)-傳送給焦點窗體 ,對於每一個正在執行的Windows應用程式,系統為其建立一個“訊息佇列”。 2)control的invoke,begin invoke .委託的invok

python學習--python實現按鍵精靈之windows訊息機制文章整理

1.如何利用Python和win32程式設計避免重複性體力勞動(一)——開始、FindWindow和FindWindowEx http://blog.csdn.net/seele52/article/details/17504925 2.如何利用Python和win32程式設計避免重

windows訊息機制詳解

MessageBox("ComboBox 選項"+str+" selected!"); 在按鈕1 的響應函式OnButton1()中新增程式碼: m_tab1.SetCurSel(0); NMHDR nmhdr; nmhdr.code=TCN_SELCHANGE; nmhdr.hwndFrom=GetDlgI

180108 逆向-Windows訊息機制(鍵盤訊息

1625-5 王子昂 總結《2018年1月8日》 【連續第465天總結】 A. Windows訊息系統-鍵盤訊息 B. 鍵盤訊息 概述 應用程式從系統接收到的關於鍵盤的訊息可以分為兩類:擊鍵和字元。 物理層面上,對於某個按鍵(例如A),會發出“按

windows訊息機制

一 Windows中有一個系統訊息佇列,對於每一個正在執行的Windows應用程式,系統為其建立一個“訊息佇列”,即應用程式佇列,用來存放該程式可能 建立的各種視窗的訊息。應用程式中含有一段稱作“訊息迴圈”的程式碼,用來從訊息佇列中檢索這些訊息並把它們分發到相應的視窗函式中。 二 Win

MFC(一)——WINDOWS訊息機制

建立一個完整的視窗需要經過下面四個操作步驟: 設計一個視窗類; 註冊視窗類; 建立視窗; 顯示及更新視窗。 #include <Windows.h> #include <stdio.h> LRESULT CALLBACK Wi

Windows訊息機制以及相關API

 訊息系統對於一個win32程式來說十分重要,它是一個程式執行的動力源泉。一個訊息,是系統定義的一個32位的值,他唯一的定義了一個事件,向 Windows發出一個通知,告訴應用程式某個事情發生了。例如,單擊滑鼠、改變視窗尺寸、按下鍵盤上的一個鍵都會使Windows傳送一個訊

windows訊息機制中lparam與wparam兩個引數的分析

一. WPARAM 和 LPARAM 本質上沒有什麼區別:都是32位數, 但是區別也還是有的:MICROSOFT在使用時兩種引數分別代表不同的含義和內容,WPARAM常常代表一些控制元件的ID或者高位低位組合起來分別表示滑鼠的位置,如果訊息的傳送者需要將某種結構的指標或者是

深入理解windows 訊息機制

再例如,按下一個按鈕,他向父視窗傳送的訊息也可以看作是一個控制元件通知訊息;單擊滑鼠所產生的訊息可以由主視窗直接處理,然後交給控制元件視窗處理。其中視窗訊息及控制元件通知訊息主要由視窗類即直接或間接由CWND類派生類處理。相對視窗訊息及控制元件通知訊息而言,命令訊息的處理物件範圍就廣得多,它不僅可以由視窗類處

Windows訊息機制『經典』

Windows訊息機制【轉】   2010-03-06 15:17:47|  分類: c/c++/c#語言相關 |字號 訂閱 原文地址: http://blog.csdn.net/recle/archive/2008/11/08/3256614.aspx (經修正的)原文

WIN32學習——Windows訊息機制(一)

1、Win32視窗程式採用的是事件驅動方式執行,也就是訊息機制,當系統通知視窗工作時,就是採用訊息的方式派發給視窗,通過呼叫視窗處理函式進行對訊息對處理。 2、訊息MessageBox結構體: int MessageBox( HWND hWnd, //父視窗

windows訊息機制與ASP.net winform控制元件訊息傳遞之滑鼠點選click事件

window系統是一個訊息驅動的系統, windows作業系統本身有自己的訊息佇列,訊息迴圈,它捕捉鍵盤,滑鼠的動作生成訊息,並將這個訊息傳給應用程式的訊息佇列。 當用戶用滑鼠click桌面時,其實使用者是不能直接接觸到某個控制元件的。表面上看,的確是使用者用

Windows訊息機制之二(續)-- windows訊息訊息佇列

與基於MS - DOS的應用程式不同,Windows的應用程式是事件(訊息)驅動的。它們不會顯式地呼叫函式(如C執行時庫呼叫)來獲取輸入,而是等待windows向它們傳遞輸入。 windows系統把應用程式的輸入事件傳遞給各個視窗,每個視窗有一個函式,稱為視窗訊息處理函式。

[轉]windows訊息機制(MFC)

訊息分類與訊息佇列 Windows中,訊息使用統一的結構體(MSG)來存放資訊,其中message表明訊息的具體的型別, 而wParam,lParam是其最靈活的兩個變數,為不同的訊息型別時,存放資料的含義也不一樣。 time表示產生訊息的時間,pt表示產生訊息時滑

Windows 訊息機制淺析

1. Windows 的歷史中國人喜歡以史為鑑,而事實也確實是,如果你能知道一件事情的來龍去脈,往往可以更容易地理解事物為什麼會表現為當前這樣的現狀。所以,我的介紹性開場白通常會以一段歷史開始。不過,我不會以精確到年月日的那種方式詳細講述,而是選取幾個對我們的程式設計生涯有重

windows 訊息機制、視窗過程與執行緒間訊息傳遞

按照自己的理解好好整理一遍 訊息機制 windows是一個訊息驅動的系統,會有一個總的系統訊息的佇列,滑鼠、鍵盤等等都會流入到這個佇列中,同時會為每個執行緒維護一個訊息佇列(注意預設是有GUI呼叫的執行緒才有,對於沒有GUI或者視窗的執行緒,只有當線上程內呼叫get/pe

淺談Windows SDK視窗程式的訊息機制

Windows系統的訊息機制 一個庫函式(比如fopen),最終會呼叫作業系統的API來實現其功能,在Windows中,不僅庫函式最終會呼叫系統函式,系統函式反過來也會呼叫使用者函式,這種機制就是通過訊息來實現的。 我們假設程式發生了一項滑鼠點選“關閉”按鈕的操作,系統會發現這次操作,並將這次操作包裝成訊息

Windows程式和訊息機制(三):訊息與程序間通訊

自定義訊息與程序間通訊 視窗程式可以接收自定義的訊息型別,前提是通訊的程序聲明瞭這種訊息型別,宣告的方法很簡單,WM_USER加一個值就可以了,一般加的值從0x400開始,其他的值已經被系統使用了。 實現一個完整的自定義訊息需要進行以下步驟:

Windows程式和訊息機制(二):訊息有關的函式

不同視窗程式可以通過訊息進行互動,主要用到的函式如下: FindWindow 獲取一個視窗的控制代碼。 HWND FindWindow( LPCTSTR lpClassName,// 類名 LPCTSTR lpWindowName//

Windows訊息機制要點

執行緒B收到了執行緒A發來的訊息,並進行處理, 在處理過程中,B也向執行緒A SendMessgae,然後等待從A返回。 因為此時, 執行緒A正等待從執行緒B返回, 無法處理B發來的訊息, 從而導致了執行緒A,B相互等待, 形成死鎖。多個執行緒也可以形成環形死鎖。 可以使用 SendNotifyMessage