目錄
一、 什麼是訊息
二、 訊息獲取
2.1 訊息佇列
循環" >2.2 訊息循環
三、訊息處理
首頁 運維 windows維 Win32 SDK基礎(八)之 關於Windows訊息機制的詳解(圖)

Win32 SDK基礎(八)之 關於Windows訊息機制的詳解(圖)

Jun 06, 2017 am 10:02 AM

一、 什麼是訊息

        在解釋什麼是訊息之前,我們先討論程式的執行機制問題。大體上說,程式依照執行機制可以分為兩類:
第一類是過程驅動。例如我們最早接觸程式時寫的C程序,又或者單晶片程式。這類程序往往預先已經設定好了執行流程,我們執行時只是按部就班的執行;
第二類是事件驅動。事件,相信大家都能夠理解。每個事件的發生都是隨機的,每個事件都會有發生的時刻,類似生活中的事件。程式中的事件也會有自己的觸發點,事件驅動程式就是事先編寫好了針對每個事件的處理流程。在Windows的作業系統中,訊息就是Windows中的事件。 Windows中的幾乎每個操作都會觸發訊息,像我們之前講過的建立視窗會觸發WM_CREATE訊息,繪製視窗會觸發WM_PAINT訊息,我們點擊滑鼠、鍵盤、都會觸發對應的訊息。
        Windows的訊息被封裝成了一個叫做MSG的結構體,其原型如下:

typedef struct tagMSG { // msg 
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
} MSG;
登入後複製

Hwnd —— 觸發訊息的視窗的句柄。
Message —— 訊息ID。 Windows作業系統為每個訊息都分配了一個訊息ID,這個ID是唯一的。我們在上文中提到的WM_CREATE本質就是一個整數,就是訊息ID。
wParam —— 訊息可附帶的參數。
lParam —— 訊息可附帶的參數。
Time —— 發生訊息的時刻。
Pt —— 發生訊息時滑鼠所在的位置。
以上參數對訊息來說,缺一不可。
Windows中就是將一個個訊息封裝成MSG物件傳送訊息時,將這些物件放置到訊息佇列中;取得訊息時,也是取得的這些MSG物件。

二、 訊息獲取

2.1 訊息佇列

        我們說過,在Windows中幾乎每個動作都會觸發一則訊息,這些訊息都會被傳送到訊息隊列中。何為訊息隊列?我們可以將其理解為使用了一個存放Msg物件的先進先出的Deque—— Deque。訊息佇列分為兩種,一種是系統訊息佇列,另外一種是進程訊息佇列。我們在觸發訊息後,訊息先進入系統訊息佇列。作業系統處理後會根據訊息的的視窗句柄hwnd值將訊息分配到我們程式自己的訊息佇列,然後在我們程式內部進行訊息的處理。

2.2 訊息循環

        在前面的文章中,我們曾經寫過一個訊息循環。所謂的訊息循環,就是不斷的讀取我們的進程中的消息隊裡的消息,然後在進行處理。

void Message()  
{  
    MSG nMsg = { 0 };  
    while (GetMessage(&nMsg, NULL, 0, 0))  
    {  
        TranslateMessage(&nMsg);  
        DispatchMessage(&nMsg);  
    }  
}
登入後複製


        這裡面,GetMessage()不斷的在訊息佇列中抓取訊息,其函數原型如下:
GetMessage(LPMSG lpMsg,HWND hWnd,UINT wMsgFilterMin,UINT wMsgFilterMax)
lpMsg —— 用來存放訊息的MSG類型的指針。
hWnd —— 指定取得其訊息的視窗的句柄。當其值取NULL時,GetMessage會為任何屬於呼叫執行緒的視窗檢索訊息。
wMsgFilterMin —— 指定被檢索的最小訊息值的整數。
wMsgFilterMax —— 指定被檢索的最大訊息值的整數。

        GetMessage()取得到訊息後,TranslateMessage會將訊息翻譯,主要是把虛擬鍵訊息轉換為字元訊息。字元訊息被寄到呼叫線程的訊息佇列裡,當下一次執行緒呼叫函數GetMessage或PeekMessage時被讀出。 Windows中每一個鍵盤按鍵,都對應了一個宏,這個鍵盤按鍵發出的訊息就是虛擬鍵訊息。 TranslateMessage的作用是將虛擬鍵訊息轉換成字元訊息WM_CHAR、WM_SYSCHAR等等。

三、訊息處理

        DispatchMessage的作用是將訊息,分派到我們實現定義好的視窗處理函數中處理,以下是我們在之前的文章中定義的視窗處理函數:

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)  
{  
	switch (uMsg)  
	{  
	case WM_DESTROY:  
		PostQuitMessage(0);//可¨¦以°?使º1GetMessage返¤¦Ì回?0  
		break;  
	default:  
		break;  
	}  
	return DefWindowProc(hWnd, uMsg, wParam, lParam);  
}
登入後複製


hWnd就是产生消息的窗口句柄,uMsg是传递的消息,wParam和lParam分别是消息携带的两个参数。在上面的窗口处理函数中,我们定只处理了一个消息WM_DESTROY,这是我们在点击窗口的关闭按钮后产生的一个消息。我们说过,我们在创建窗口是,也会产生一个WM_CREATE消息。下面我们在窗口处理函数中处理这个消息:

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)  
{  
	switch (uMsg)  
	{  
	case WM_DESTROY:  
		PostQuitMessage(0);//可¨¦以°?使º1GetMessage返¤¦Ì回?0  
		break; 
	case  WM_CREATE:
		MessageBox(NULL,"WM_CREATE消息被处理了","消息处理",MB_OK);
	default:  
		break;  
	}  
	return DefWindowProc(hWnd, uMsg, wParam, lParam);  
}
登入後複製


        我们在接受到WM_CREATE后,会弹出一个对话框。预期的效果是点击这个对话框的确定按钮后才会显示窗口。如下面所示:

        运行程序,先弹出对话框:


        点击确定按钮后,弹出窗口:


以上是Win32 SDK基礎(八)之 關於Windows訊息機制的詳解(圖)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Windows 11 22H2 將雲母/壓克力設計帶入更多 Win32 桌面應用程式 Windows 11 22H2 將雲母/壓克力設計帶入更多 Win32 桌面應用程式 Apr 14, 2023 pm 04:58 PM

Windows 11 的原生應用程式(如檔案總管)和其他 shell 應用程式預設使用圓角和 Fluent Design 元素(如 Acrylic)。除了圓角,Windows 11 的另一個重要設計特點是雲母等材質,它將應用程式的背景顏色與桌面對齊。雲母與壓克力類似,但其工作方式略有不同。正如微軟所描述的,Windows Mica 材料透過將背景與應用程式對齊來創建「顏色層次結構

微軟正在為 Windows 11 開發新的模糊效果 微軟正在為 Windows 11 開發新的模糊效果 May 13, 2023 am 09:04 AM

用於build22523的新Windows11SDK透露,微軟正在為Windows11開發新的模糊效果。此效果稱為Tabbed,並且是對Acrylic和Mica的補充。 22523SDK中的新DWMWA_SYSTEMBACKDROP_TYPE、雲母、亞克力的公共Win32API及其奇怪的新「選項卡」混合:pic.twitter.com/dbsu7ZFiIi-一切都回來了(@StartIsBack)2021年12月15日可以在以下SDK的範例應用程式

Windows 11 中的 Trojan/win32.casdet Rfn Windows 11 中的 Trojan/win32.casdet Rfn Apr 14, 2023 pm 02:49 PM

防毒軟體有時可能會在 Windows 32 筆記型電腦上顯示警告,指出 Trojan/win11.casdet rfn。它表示PC感染了特洛伊木馬惡意軟體,導致其故障。幸運的是,有一些可能的方法可以解決此問題,如下所述。此外,您可能對我們關於 cdn.districtm.io 是否為彈出視窗/病毒/惡意軟體的詳細指南感興趣。什麼是 Trojan/win32.casdet rfn? Trojan/win32.casdet rfn 是一種嚴重的木馬病毒感染,可以超越系統並殺死其進程,使其容易

win32和win64有什麼差別 win32和win64有什麼差別 May 29, 2023 pm 05:22 PM

win32和win64的差別是:1、win32是指Microsoft Windows作業系統的32位元環境,win64是指Microsoft Windows作業系統的64位元版本,比32位元版本更穩定快速;2、win32最高支援2G的內存, win64必須是4G以上記憶體;3、win64支援基於64位元的處理器,而win32卻無法完全支援;4、win32追求簡潔,win64追求效能。

掌握Java海康SDK二次開發的必備技巧 掌握Java海康SDK二次開發的必備技巧 Sep 06, 2023 am 08:10 AM

掌握Java海康SDK二次開發的必備技巧引言:隨著資訊科技的快速發展,視訊監控系統在各領域得到了廣泛的應用。而作為國內領先的視訊監控解決方案提供商,海康威視的產品和技術一直在市場中佔有重要的地位。為了滿足不同專案的需求,海康威視提供了SDK供開發者進行二次開發。本文將介紹一些掌握Java海康SDK二次開發的必備技巧,並附上對應的程式碼範例。一、了解海康威視

微軟開始測試 Windows 11 的 OneNote 新設計 微軟開始測試 Windows 11 的 OneNote 新設計 Apr 19, 2023 pm 08:01 PM

早在2021年8月,微軟就承諾Windows10和Windows11上的OneNote將在未來幾個月內收到一系列主要功能更新,這是這家科技巨頭將多個版本的筆記應用程式統一為單一版本的努力的一部分客戶。 OneNote在過去幾年中發生了許多變化。 2018年,當微軟真正希望人們使用其UWP版本的OneNote時,該公司停止將原始且功能豐富的OneNote版本與預先安裝的Office應用程式捆綁在一起。相反,微軟只提供了UWP客戶端並為現代版本添加了新功能。微軟後來改

sdk是什麼 sdk是什麼 Jan 06, 2023 pm 03:26 PM

sdk全名為“Software Development Kit”,中文意思是“軟體開發工具包”,是由硬體平台、作業系統(OS)或程式語言的製造商提供的一套工具。 SDK可協助軟體開發人員為特定的平台、系統或程式語言建立應用程式。一個基本的SDK通常由編譯器、偵錯器和應用程式介面(API)組成,但也可能包含其他內容,例如:文件、函式庫、執行時間/開發環境、測試/分析工具、網路協定等。

Windows App SDK 1.2 現已上線,這是新功能 Windows App SDK 1.2 現已上線,這是新功能 May 12, 2023 pm 06:07 PM

WindowsAppSDK是一組工具和API,開發人員可以在其Windows應用程式中使用這些工具和API,以便在使用Windows10(版本1809及更高版本)和Windows11的各種裝置上提供「一致」的功能。了解它確實很重要它不會取代現有的應用程式類型,例如.NET或WindowsSDK,它只是提供一個統一的API工具集,可以用來補充您現有的應用程式。今天,微軟發布了具有許多新功能的WindowsAppSDK1.2版本。此版本的亮點可能是第三方開發人

See all articles