Windows程式開發的背景知識---Windows訊息機制

來源:互聯網
上載者:User

標籤:

一,訊息

      訊息(Message)指的就是Windows 作業系統發給應用程式的一個通知,它告訴應用程式某個特定的事件發生了。比如,使用者單擊滑鼠或按鍵都會引發Windows 系統發送相應的訊息。最終處理訊息的是應用程式的視窗函數,如果程式沒處理的話作業系統有預設函數將會作出處理。
     從資料結構的角度來說,訊息是一個結構體,它包含了訊息的類型標識符以及其他的一些附加資訊。系統定義的結構體MSG用於表示訊息,MSG 具有如下定義形式:
typedef struct MSG
{
     HWND hwnd;                    //hwnd 是視窗的控制代碼,這個參數將決定由哪個視窗過程函數對訊息進行處理 
     UINT message;                  //message是一個訊息常量,用來表示訊息的類型 
     WPARAM wParam;            //32 位的附加資訊,具體表示什麼內容,要視訊息的類型而定 
     LPARAM lParam;               //32 位的附加資訊,具體表示什麼內容,要視訊息的類型而定 
     DWORD time;                   //time 是訊息發送的時間 
     POINT pt;                         //訊息發送時滑鼠所在的位置 
} 二,Windows編程原理     Windows 是一訊息(Message)驅動式系統,Windows 訊息提供了應用程式與應用程式之間、應用程式與Windows 系統之間進行通訊的手段。應用程式要實現的功能由訊息來觸發,並靠對訊息的響應和處理來完成。Windows 系統中有兩種訊息佇列,一種是系統訊息佇列,另一種是應用程式訊息佇列。電腦的所有輸入裝置由 Windows 監控,當一個事件發生時,Windows 先將輸入的訊息放入系統訊息佇列中,然後再將輸入的訊息拷貝到相應的應用程式隊列中,應用程式中的訊息迴圈從它的訊息佇列中檢索每一個訊息並發送給相應的視窗函數中。            箭頭1 說明作業系統能夠操縱輸入輸出裝置,例如讓印表機列印;     箭頭2 說明作業系統能夠感知輸入輸出裝置的狀態變化,如按一下滑鼠,按鍵按下等,這就是作業系統和電腦硬體之間的互動關係     箭頭3 是代理程式更新作業系統執行某個具體的操作,這是通過叫用作業系統的API 來實現的;     箭頭4 作業系統能夠感知硬體的狀態變化,但是並不決定如何處理,而是把這種變化封裝成訊息轉交給應用程式,由應用程式決定如何處理,箭頭4說明了這種轉交情況。 三,Windows訊息迴圈     訊息迴圈是Windows 應用程式存在的根本,應用程式通過訊息迴圈擷取各種訊息,並通過相應的視窗過程函數,對訊息加以處理;正是這個訊息迴圈使得一個應用程式能夠響應外部的各種事件。          Windows 作業系統為每個線程維持一個訊息佇列,當事件產生時,作業系統感知這一事件的發生,並封裝成訊息發送到訊息佇列,應用程式通過GetMessage()函數取得訊息並存於一個訊息結構體中,然後通過一個TranslateMessage()和DispatchMessage()解釋和分發訊息,下面的代碼描述了Windows 的訊息迴圈。

while(GetMessage (&msg, NULL, 0, 0))
{
     TranslateMessage (&msg) ;
     DispatchMessage (&msg) ;
}
TranslateMessage(&msg)對於大多數訊息而言不起作用,但是有些訊息,比如鍵盤按鍵按下和彈起(分別對於KeyDown 和KeyUp 訊息),卻需要通過它解釋,產生一個WM_CHAR訊息。DispatchMessage(&msg)負責把訊息分發到訊息結構體中對應的視窗,交由視窗過程函數處理。GetMessage()在取得WM_QUIT 之前的傳回值都為TRUE,也就是說只有擷取到WM_QUIT 訊息才返回FALSE,才能跳出訊息迴圈。

     對一個Windows表單程式而言,在Program.cs檔案中的Main函數中,有如下的代碼:     Application.Run(new Form1());     這行代碼的意思就是在當前線程上開始運行標準應用程式訊息迴圈,並使指定表單可見。實際上就是啟動了一個GetMessage的無限迴圈。而這個響應Windows訊息的線程就被稱做Windows表單程式的UI線程 四,主要函數的區別SendMessage()與PostMessage()是用於嚮應用程式發送訊息的。SendMessage()將訊息直接加入到應用程式的訊息佇列中,在應用程式處理完此訊息後,它才返回。PostMessagex()將訊息直接加入到應用程式的訊息佇列中,不等程式返回就退出。PeekMessage和GetMessage用來從訊息佇列中取出資料,GetMessage從訊息佇列裡取得一個訊息並將其放於指定的結構,擷取訊息成功後,線程將從訊息佇列中刪除該訊息。GetMessage函數會一直等待直到有訊息到來才有傳回值。PeekMessage函數檢查訊息佇列,並將該訊息(如果存在)放於指定的結構,然後返回,不會等待。

Windows程式開發的背景知識---Windows訊息機制

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.