一、从Windows消息机制说起
生活随笔
收集整理的這篇文章主要介紹了
一、从Windows消息机制说起
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?
一,消息
消息(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,才能跳出消息循環。
轉載于:https://www.cnblogs.com/h2zZhou/p/9475622.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的一、从Windows消息机制说起的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何获得select被选中option的
- 下一篇: windows下在一台电脑上配置多个gi