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中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

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

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

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

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

一位微軟官員證實了有關GoogleChrome、ChromiumEdge、Discord和其他幾個應用程式被微軟內建防毒軟體「WindowsDefender」標記為「 Behavior:Win32/Hive.ZY」的廣泛報導。這家科技巨頭在聲明中證實,它正在研究一個修復程序,該修復程序將在接下來的幾個小時內向所有人推出。那麼「Behavior:Win32/Hive.ZY」到底是什麼?根據微軟安全入口網站上發布的文件,任何標記為「Behavior:Win32/Hive.ZY」的文件都是帶有

Microsoft正在將大量新功能放入MicrosoftStore。隨著公司繼續努力使應用程式商店更適合使用Windows的每個人,這些都將使最終用戶和開發人員受益。這些變更的最大亮點之一將是Windows11上MicrosoftStore中的新「復原應用程式」功能。它將連接到用戶的Microsoft帳戶,因此登入新的Windows11PC後,他們只需單擊幾下即可自動恢復應用程式。 「為了讓客戶更容易快速、無縫地過渡到他們的新PC,我們很快就會在WindowsInsider頻道

許多Windows11和10用戶看到WindowsDefender的警告通知表示偵測到威脅「行為:Win32/Hive.ZY」而感到困擾。據報道,當用戶嘗試開啟一些常用應用程式(如GoogleChrome或ChromiumEdge、Whatsapp、Discord和Spotify)時,會引發此WindowsDefender警告或警報。即使您在PC上阻止了此威脅,它也會在您下次打開此受影響的應用程式時彈出並顯示一條訊息MicrosoftDefenderAntivi

近日新消息,Canva推出了一系列AI圖像工具功能試圖與Adobe的Firefly抗衡,其旨在簡化工作場所的內容創建流程,讓非設計專業人士更容易、更有效率地創作內容,讓平面設計師能夠專注於關鍵任務,並挑戰Adobe在市場上的主導地位。根據介紹,Canva的VisualWorksuite已經整合了全新的BrandHub,旨在為使用者提供一套工具,幫助他們確保與其組織的視覺識別保持一致。使用者可以利用此工具創建包含公司文化資訊(例如LOGO、字體、顏色和統一設計風格)的BrandKit(品牌IP工具包)。
