搜尋
首頁運維windows維Win32 SDK基礎(十一)之訊息佇列與GetMessage/PeekMessage、SendMessage/Postmesage的詳解

一、訊息佇列

1.1 訊息佇列

        訊息佇列是用來存放訊息的一個佇列,訊息在佇列中先入先出,所有的視窗程式都具有訊息佇列,程式可以從佇列中取得訊息。

1.2 訊息佇列的類型

        系統訊息佇列:由作業系統維護的訊息佇列,存放系統產生的訊息,如滑鼠、鍵盤訊息等等。

        程式訊息佇列:屬於每個應用程式(執行緒)的訊息佇列,並以應用程式維護。

        當產生滑鼠、鍵盤等訊息時,訊息先存放到系統訊息佇列,然後作業系統根據儲存的訊息找到對應的視窗的訊息佇列,將訊息投遞到視窗的訊息佇列中。

1.3 佇列訊息與非佇列訊息

        佇列訊息:訊息發出後,先放入佇列,然後透過訊息循環取得。常見的隊列訊息:鍵盤、滑鼠、計時器訊息等等。

        非佇列訊息:訊息發出後,直接找到視窗的訊息處理函數,呼叫訊息處理函數處理,無需經過訊息佇列。常見的非佇列訊息:WM_PAINT、WM_SIZE等等。

二、訊息循環與GetMessage/PeekMessage

2.1 訊息循環

        一般的訊息循環如下:

void Message(HWND hWnd)  
{  
	MSG nMsg = { 0 };
	while (GetMessage(&nMsg, hWnd, 0, 0))  
	{  
		TranslateMessage(&nMsg);  
		DispatchMessage(&nMsg);  

		if(nMsg.message == WM_PAINT)
		{
			char buff[30]={};
			sprintf(buff,"处理消息%d\n",nMsg.message);
			WriteConsole(hOutput,buff,sizeof(buff),NULL,NULL);
		}
	}  
}

GetMessage/PeekMessage:從程式的訊息隊列當中獲取訊息。

TranslateMessage:將鍵盤上的按鍵等訊息翻譯成字元訊息。 

DispatchMessage:將翻譯後的訊息再次放入程式的訊息佇列中。

2.2 GetMessage和PeekMessage

GetMessage(
LPMSG lpMsg,
HWND hWnd,
UINT wMsgFilterMin,
UINT wMsgFilterMax
)

lpMsg:指向MSG結構的指針,該結構從線程的訊息佇列裡接收訊息訊息。
hWnd:取得其訊息的視窗的句柄。當其值取NULL時,GetMessage為任何屬於呼叫執行緒的視窗檢索訊息,執行緒訊息透過PostThreadMessage寄送給呼叫執行緒。
wMsgFilterMin:指定被檢索的最小訊息值的整數
wMsgFilterMax:指定被檢索的最大訊息值的整數。
傳回值:如果函數取得WM_QUIT以外的其他訊息,則傳回非零值。如果函數取得WM_QUIT訊息,則傳回值是零。如果出現了錯誤,回傳值是-1。例如,當hWnd是無效的視窗句柄或lpMsg是無效的指標。若想獲得更多的錯誤訊息,請呼叫GetLastError函數。

BOOL PeekMessage(
LPMSG IpMsg,
HWND hWnd,
UINT wMSGfilterMin,
UINT wMsgFilterMax,
UINT wRemoveMsg
);

lpMsg:接收訊息訊息的MSG結構指標。
hWnd:其訊息被檢查的視窗句柄。
wMsgFilterMin:指定被檢查的訊息範圍裡的第一個訊息。
wMsgFilterMax:指定被檢查的訊息範圍裡的最後一個訊息。
wRemoveMsg:確定訊息如何被處理。此參數可選擇下列值之一:

意義

#PM_NOREMOVE

PeekMessage處理後,訊息不會從佇列中除掉。

PM_REMOVE

#PeekMessage處理後,訊息從佇列中除掉。

PM_NOYIELD

#此標誌可讓系統不釋放等待呼叫程式空閒的執行緒。可將PM_NOYIELD隨意組合到PM_NOREMOVE或PM_REMOVE。

#


GetMessage和PeekMessage的主要区别在于:GetMessage是阻塞函数,它会在消息循环中会一直阻塞直到消息队列中出现了消息可以被获取,而PeekMessage是非阻塞函数,不管有没有获取到消息队列中的消息,它都会返回。PeekMessage更多用来检测消息队里中是否有消息,它的最后一个参数可以用来指定获取到消息后要不要把消息从消息队列中移除,通常情况下通过PeekMessage检测到消息队列有消息之后,再调用GetMessage区获取。

2.3 GetMessage/PeekMessage获取消息的过程

1、先在程序的消息队列中查找消息,如果有队列消息,就取出消息。

2、如果程序的消息队列中没有消息,向系统的消息队列获取属于本程序的消息。如果系统的消息队列中有属于本程序的消息,系统的消息队列会将消息分发到本程序的消息队列中。

3、如果系统的消息队列也没有消息,检查窗口需要绘制的区域是否需要重绘,如果发现有需要重绘的区域,产生WM_PAINT消息。

4、如果没有重新绘制区域,检查是否具有到时的定时器,如果有产生WM_TIMER定时器消息。

5、如果没有到时的定时器,整理程序的资源、内存等等。

三、SendMessage和PostMessage

LRESULT SendMessage(
HWND hWnd,
UINT Msg,
WPARAM wParam,
LPARAM IParam
)

hWnd:其窗口程序将接收消息的窗口的句柄。如果此参数为HWND_BROADCAST,则消息将被发送到系统中所有顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口,但消息不被发送到子窗口。
Msg:指定被发送的消息。
wParam:指定附加的消息特定信息。
IParam:指定附加的消息特定信息。

返回值:返回值指定消息处理的结果,依赖于所发送的消息。

BOOL WINAPI PostMessage(
HWND hWnd,
UINT Msg,
WPARAM wParam,
LPARAM lParam
);

hWnd:其窗口程序接收消息的窗口的句柄。可取有特定含义的两个值:
HWND_BROADCAST:消息被寄送到系统的所有顶层窗口,包括无效或不可见的非自身拥有的窗口、 被覆盖的窗口和弹出式窗口。消息不被寄送到子窗口
NULL:此函数的操作和调用参数dwThread设置为当前线程的标识符PostThreadMessage函数一样
Msg:指定被寄送的消息。
wParam:指定附加的消息特定的信息。
LParam:指定附加的消息特定的信息。
返回值:如果函数调用成功,返回非零,否则函数调用返回值为零

1、SendMessage

       发送消息到指定的窗口,并等候对方将消息处理,为阻塞函数,获取消息的执行结果后返回。主要需要发送非队列消息,发送的消息不经过消息队列。

2、PostMessage

        发送消息到程序的消息队列,不管消息有没有被处理都会立即返回,用于队列消息的发送

以上是Win32 SDK基礎(十一)之訊息佇列與GetMessage/PeekMessage、SendMessage/Postmesage的詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
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 材料通过将背景与应用程序对齐来创建“颜色层次结构

Trojan/win32.casdet Rfn in Windows 11Trojan/win32.casdet Rfn in Windows 11Apr 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追求性能。

微软开始测试 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客户端并为现代版本添加了新功能。微软后来改

Windows 11 上的 Microsoft Store 有哪些新功能?Windows 11 上的 Microsoft Store 有哪些新功能?Apr 28, 2023 pm 06:13 PM

Microsoft正在将大量新功能放入MicrosoftStore。随着公司继续努力使应用商店更适合使用Windows的每个人,这些都将使最终用户和开发人员受益。这些更改的最大亮点之一将是Windows11上MicrosoftStore中的新“恢复应用程序”功能。它将连接到用户的Microsoft帐户,因此登录到新的Windows11PC后,他们只需单击几下即可自动恢复应用程序。“为了让客户更容易快速、无缝地过渡到他们的新PC,我们将很快在WindowsInsider频道

Microsoft 发布针对 Windows Defender 中的 Behavior:Win32/Hive.ZY 错误的修复程序Microsoft 发布针对 Windows Defender 中的 Behavior:Win32/Hive.ZY 错误的修复程序Apr 28, 2023 pm 04:01 PM

一位微软官员证实了有关谷歌Chrome、ChromiumEdge、Discord和其他几个应用程序被微软内置防病毒软件“WindowsDefender”标记为“ Behavior:Win32/Hive.ZY”的广泛报道。这家科技巨头在一份声明中证实,它正在研究一个修复程序,该修复程序将在接下来的几个小时内向所有人推出。那么“Behavior:Win32/Hive.ZY”到底是什么?根据微软安全门户上发布的一份文件,任何标记为“Behavior:Win32/Hive.ZY”的文件都是带有

Win32图形设计软件Canva 推出免费AI工具,挑战巨头 AdobeWin32图形设计软件Canva 推出免费AI工具,挑战巨头 AdobeMar 05, 2024 pm 04:34 PM

近日新消息,Canva推出了一系列AI图像工具功能试图与Adobe的Firefly抗衡,其旨在简化工作场所的内容创建流程,让非设计专业人士更容易、更高效地创作内容,让平面设计师能够专注于关键任务,并挑战Adobe在市场上的主导地位。据介绍,Canva的VisualWorksuite已经整合了全新的BrandHub,旨在为用户提供一套工具,帮助他们确保与其组织的视觉标识保持一致。用户可以利用这一工具创建包含公司文化信息(例如LOGO、字体、颜色和统一设计风格)的BrandKit(品牌IP工具包)。

如何修复 Windows Defender 行为:Win32/Hive.ZY 警报如何修复 Windows Defender 行为:Win32/Hive.ZY 警报May 06, 2023 am 08:04 AM

许多Windows11和10用户看到来自WindowsDefender的警告通知表示检测到威胁“行为:Win32/Hive.ZY”而感到困扰。据报道,当用户尝试打开一些常用应用程序(如GoogleChrome或ChromiumEdge、Whatsapp、Discord和Spotify)时,会引发此WindowsDefender警告或警报。即使您在PC上阻止了此威胁,它也会在您下次打开此受影响的应用程序时弹出并显示一条消息MicrosoftDefenderAntivi

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前By尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

SublimeText3 Mac版

SublimeText3 Mac版

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

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器