1. 程式人生 > 實用技巧 >Windows核心程式設計第02天 訊息機制

Windows核心程式設計第02天 訊息機制

1.訊息的概念

訊息是指windows作業系統發給應用程式的一個通告,告訴程式某個特定的事件發生了。比如使用者點選滑鼠,會引發相關的訊息,並交給相應的程式去處理。最終處理訊息的是應用程式的視窗函式,如果程式不負責處理的話,系統會作出預設的處理。

從資料結構的角度來說,訊息是一個結構體,包含了訊息的型別識別符號以及其他的一些附加訊息。

系統定義的結構體MSG用於表示訊息,MSG具有如下形式:

typedef struct tagMSG {
  HWND   hwnd;  //指定接收訊息的視窗控制代碼,如果是執行緒訊息,該值是 NULL
  UINT   message;  //訊息的識別符號
  WPARAM wParam;  //指定訊息的附加訊息,確切的含義取決於訊息成員的值
  LPARAM lParam;  //指定訊息的附加訊息,確切的含義取決於訊息成員的值
  DWORD  time;  //該訊息被投放到訊息佇列的時間
  POINT  pt;  //當訊息被投放到訊息佇列的時,滑鼠位於螢幕中的位置
} MSG, 
*PMSG, *LPMSG;

2.Windows程式設計原理

Windows 是一訊息(Message)驅動式系統,Windows 訊息提供了應用程式與應用程式之間、應用程式與Windows 系統之間進行通訊的手段。應用程式要實現的功能由訊息來觸發,並靠對訊息的響應和處理來完成。Windows 系統中有兩種訊息佇列,一種是系統訊息佇列,另一種是應用程式訊息佇列。計算機的所有輸入裝置由 Windows 監控,當一個事件發生時,Windows 先將輸入的訊息放入系統訊息佇列中,然後再將輸入的訊息拷貝到相應的應用程式佇列中,應用程式中的訊息迴圈從它的訊息佇列中檢索每一個訊息併發送給相應的視窗函式中。一個事件的發生,到達處理它的視窗函式必須經歷上述過程。

在程式佇列中,應用程式中的訊息迴圈從它的訊息佇列中檢索每一個訊息併發送給相應的視窗函式中。一個事件的發生,到達處理它的視窗函式必須經歷上述過程。所謂訊息就是描述事件發生的資訊,Windows程式是事件驅動的,用這一方法編寫程式

避免了死板的操作模式,因為Windows程式的執行順序將取決於事件的發生順序,具有不可預知性。

3.windows訊息迴圈

訊息迴圈是Windows應用程式存在的根本,應用程式通過訊息迴圈獲取各種訊息,並通過相應的視窗過程函式,對訊息加以處理;正是這個訊息迴圈使得一個應用程式能夠響應外部的各種事件,所以訊息迴圈往往是一個Windows應用程式的核心部分。Windows的訊息機制如圖所示:

Windows 作業系統為每個執行緒維持一個訊息佇列,當事件產生時,作業系統感知這一事件的發生,幷包裝成訊息傳送到訊息佇列,應用程式通過GetMessage()函式取得訊息並存於一個訊息結構體中,然後通過一個TranslateMessage()和DispatchMessage()解釋和分發訊息,下面的程式碼描述了Windows 的訊息迴圈。

4.訊息的處理

取得的訊息將交由視窗處理函式進行處理,對於每個視窗類Windows為我們預備了一個預設的視窗過程處理函式DefWindowProc(),這樣做的好處是,我們可以著眼於我們感興趣的訊息,把其他不感興趣的訊息傳遞給預設視窗過程函式進行處理。每一個視窗類都有一個視窗過程函式,此函式是一個回撥函式,它是由Windows作業系統負責呼叫的,而應用程
序本身不能呼叫它。以switch語句開始,對於每條感興趣的訊息都以一個case引出。示例如下:

LRESULT CALLBACK WinProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_PAINT:

    case WM_CLOSE:
        DestroyWindow(hwnd);
        break;
    case WM_QUIT:
        PostQuitMessage(0);
        break;
    default:
        break;
    }

    return DefWindowProc(hwnd, message, wParam, lParam);
}