検索
ホームページ運用・保守窓の運用と保守Win32 SDKの基礎 (11) メッセージキューとGetMessage/PeekMessage、SendMessage/Postmesageの詳細説明

1. メッセージキュー

1.1 メッセージキュー

メッセージキューは、メッセージをキューに格納するために使用されるキューであり、すべてのウィンドウプログラムはメッセージキューを持っています。待ち行列。

1.2 メッセージ キューの種類

システム メッセージ キュー: オペレーティング システムによって維持されるメッセージ キュー。マウスやキーボードのメッセージなど、システムによって生成されたメッセージが保存されます。

プログラム メッセージ キュー: 各アプリケーション (スレッド) に属し、アプリケーションによって維持されるメッセージ キュー。

マウス、キーボードなどのメッセージが生成されると、メッセージはまずシステム メッセージ キューに保存され、次にオペレーティング システムが保存されたメッセージに基づいて対応するウィンドウのメッセージ キューを見つけて、メッセージをウィンドウのメッセージキュー。

1.3 キューメッセージと非キューメッセージ

キューメッセージ: メッセージは送信後、まずキューに入れられ、次にメッセージ ループ を通じて取得されます。一般的なキュー メッセージ: キーボード、マウス、タイマーメッセージなど。

非キューメッセージ: メッセージ送信後、ウィンドウのメッセージ処理関数を直接見つけて、メッセージキューを経由せずにメッセージ処理関数を呼び出して処理します。一般的なキュー以外のメッセージ: WM_PAINT、WM_SIZE など。

2. メッセージ ループと 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 メッセージを取得した場合、戻り値は 0 です。エラーが発生した場合、戻り値は -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の基礎 (11) メッセージキューとGetMessage/PeekMessage、SendMessage/Postmesageの詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、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 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

mPDF

mPDF

mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。