日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

一、从Windows消息机制说起

發布時間:2023/12/20 windows 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一、从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,才能跳出消息循環。

對一個Windows窗體程序而言,在Program.cs文件中的Main函數中,有如下的代碼: Application.Run(new Form1()); 這行代碼的意思就是在當前線程上開始運行標準應用程序消息循環,并使指定窗體可見。實際上就是啟動了一個GetMessage的無限循環。而這個響應Windows消息的線程就被稱做Windows窗體程序的UI線程 四,主要函數的區別 SendMessage()與PostMessage()是用于向應用程序發送消息的。SendMessage()將消息直接加入到應用程序的消息隊列中,在應用程序處理完此消息后,它才返回。PostMessagex()將消息直接加入到應用程序的消息隊列中,不等程序返回就退出。 PeekMessage和GetMessage用來從消息隊列中取出數據,GetMessage從消息隊列里取得一個消息并將其放于指定的結構,獲取消息成功后,線程將從消息隊列中刪除該消息。GetMessage函數會一直等待直到有消息到來才有返回值。PeekMessage函數檢查消息隊列,并將該消息(如果存在)放于指定的結構,然后返回,不會等待。

轉載于:https://www.cnblogs.com/h2zZhou/p/9475622.html

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的一、从Windows消息机制说起的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。