目次
1. メッセージとは何ですか?
Windows のほぼすべての操作でメッセージがトリガーされ、これらのメッセージはメッセージ キューに送信されると述べました。メッセージキューとは何ですか?これは、先入れ先出し Deque を使用して Msg オブジェクトを格納すると理解できます (Deque<Msg>)。メッセージ キューには 2 種類あり、1 つはシステム メッセージ キュー、もう 1 つはプロセス メッセージ キューです。メッセージをトリガーした後、メッセージはまずシステム メッセージ キューに入ります。処理後、オペレーティング システムは、メッセージのウィンドウ ハンドル hwnd 値に基づいてメッセージをプログラム独自のメッセージ キューに割り当て、プログラム内でメッセージを処理します。
ホームページ 運用・保守 窓の運用と保守 Win32 SDKの基礎(8) Windowsメッセージの仕組みを詳しく解説(図)

Win32 SDKの基礎(8) Windowsメッセージの仕組みを詳しく解説(図)

Jun 06, 2017 am 10:02 AM

1. メッセージとは何ですか?

メッセージとは何かを説明する前に、まずプログラムの実行メカニズムについて説明します。一般に、プログラムは実行メカニズムに応じて 2 つのカテゴリに分類できます:
最初のカテゴリはプロセス ドライバーです。たとえば、私たちが初めてプログラミングに触れたときに書いたCプログラムや、マイコンのプログラムなどです。このタイプのプログラムには、事前に設定された実行プロセスがあり、それを実行するときは、ステップごとに実行するだけです。 2 番目のタイプは、
イベント駆動型です。この事件は誰でも理解できると思います。各イベントの発生はランダムであり、人生の出来事と同様に、それぞれのイベントには独自の瞬間があります。プログラム内のイベントにも独自のトリガーポイントがあり、イベントドリブンプログラムでは、各イベントの処理フローが事前に記述されます。 Windows オペレーティング システムでは、メッセージは Windows のイベントです。 Windows のほぼすべての操作でメッセージがトリガーされます。ウィンドウを作成すると WM_CREATE メッセージがトリガーされ、マウスまたはキーボードをクリックすると、対応するメッセージがトリガーされます。 Windows メッセージは、MSG と呼ばれる 構造体
にカプセル化されます。そのプロトタイプは次のとおりです:

typedef struct tagMSG { // msg 
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
} MSG;
ログイン後にコピー

Hwnd - メッセージをトリガーしたウィンドウのハンドル。

メッセージ - メッセージID。 Windows オペレーティング システムは各メッセージにメッセージ ID を割り当てます。この ID は一意です。上で説明した WM_CREATE は本質的には

整数
であり、これはメッセージ ID です。 wParam - メッセージに添付できるパラメーター。 lParam - メッセージに添付できるパラメータ。
時間 - メッセージが発生した瞬間。
Pt - メッセージが発生したときのマウスの位置。
上記のパラメータはメッセージに必須です。 Windows では、各メッセージは MSG
オブジェクト
にカプセル化されます。
メッセージを送信するとき、これらのオブジェクトはメッセージを取得するときにメッセージ キューに配置されます。 2. メッセージの取得
2.1 メッセージ キュー

Windows のほぼすべての操作でメッセージがトリガーされ、これらのメッセージはメッセージ キューに送信されると述べました。メッセージキューとは何ですか?これは、先入れ先出し Deque を使用して Msg オブジェクトを格納すると理解できます (Deque)。メッセージ キューには 2 種類あり、1 つはシステム メッセージ キュー、もう 1 つはプロセス メッセージ キューです。メッセージをトリガーした後、メッセージはまずシステム メッセージ キューに入ります。処理後、オペレーティング システムは、メッセージのウィンドウ ハンドル 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 w MsgFil)ターミン、 UINT wMsgFilterMax)

lpMsg - メッセージを保存するために使用される MSG タイプのポインター。 hWnd - メッセージの取得元のウィンドウのハンドルを指定します。値が NULL の場合、GetMessage は呼び出しスレッドに属する任意のウィンドウのメッセージを取得します。 wMsgFilterMin – 取得するメッセージの最小値を指定する整数。
wMsgFilterMax – 取得するメッセージの最大値を指定する整数。

GetMessage() がメッセージを取得した後、TranslateMessage はメッセージを翻訳し、主に仮想キー メッセージを文字メッセージに変換します。文字メッセージは呼び出し側スレッドのメッセージ キューに送信され、次回スレッドが関数 GetMessage または PeekMessage を呼び出したときに読み出されます。 Windows のキーボードの各キーはマクロに対応しており、このキーボードのキーによって送信されるメッセージが仮想キー メッセージです。 TranslateMessage の機能は、仮想キー メッセージを文字メッセージ WM_CHAR、WM_SYSCHAR などに変換することです。


3. メッセージ処理

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の基礎(8) Windowsメッセージの仕組みを詳しく解説(図)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホット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

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

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Windows 11 22H2 は、より多くの Win32 デスクトップ アプリにマイカ/アクリル デザインを導入します Windows 11 22H2 は、より多くの Win32 デスクトップ アプリにマイカ/アクリル デザインを導入します Apr 14, 2023 pm 04:58 PM

Windows 11 のネイティブ アプリ (ファイル エクスプローラーなど) とその他のシェル アプリは、デフォルトで丸い角と Fluent Design 要素 (アクリルなど) を使用します。丸い角に加えて、Windows 11 のもう 1 つの重要なデザイン機能は、アプリの背景色をデスクトップと揃える雲母などのマテリアルです。マイカはアクリルに似ていますが、動作が少し異なります。 Microsoft が説明しているように、Windows Mica マテリアルは「背景をアプリに合わせて色の階層を作成します」

MicrosoftはWindows 11向けの新しいぼかし効果を開発中 MicrosoftはWindows 11向けの新しいぼかし効果を開発中 May 13, 2023 am 09:04 AM

ビルド 22523 用の新しい Windows 11 SDK は、Microsoft が Windows 11 用の新しいぼかし効果を開発していることを明らかにしました。この効果はタブ付きと呼ばれ、アクリルとマイカに追加されます。 22523 SDK の新しい DWMWA_SYSTEMBACKDROP_TYPE、Mica、Acrylic のパブリック Win32 API、およびその奇妙な新しい「タブ」ミックス: pic.twitter.com/dbsu7ZFiIi — It's All Back (@StartIsBack) December 15, 2021 次の 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 はパフォーマンスを追求します。

Microsoft、Windows 11向けの新しいOneNoteデザインのテストを開始 Microsoft、Windows 11向けの新しいOneNoteデザインのテストを開始 Apr 19, 2023 pm 08:01 PM

2021 年 8 月に遡ると、Microsoft は、テクノロジー大手が複数のバージョンのメモ作成アプリを 1 つに統合するため、Windows 10 および Windows 11 の OneNote に今後数か月以内に一連の主要な機能アップデートが提供されると約束しました。顧客の。 OneNote は過去数年間に多くの変更を加えてきました。 2018 年、Microsoft は人々に自社の UWP バージョンの OneNote を使用してもらいたいと本気で考えていたため、機能が豊富なオリジナルの OneNote バージョンとプレインストールされた Office アプリのバンドルを中止しました。代わりに、Microsoft は UWP クライアントを提供し、最新バージョンに新機能を追加しただけです。マイクロソフトはその後変更しました

Java Hikvision SDKの二次開発に必須のスキルをマスターする Java Hikvision SDKの二次開発に必須のスキルをマスターする Sep 06, 2023 am 08:10 AM

Java Hikvision SDK の二次開発に必須のスキルをマスターする はじめに: 情報技術の急速な発展に伴い、ビデオ監視システムはさまざまな分野で広く使用されています。国内の大手ビデオ監視ソリューションプロバイダーとして、Hikvision の製品と技術は常に市場で重要な位置を占めてきました。さまざまなプロジェクトのニーズを満たすために、Hikvision は開発者が二次開発を実行するための SDK を提供します。この記事では、Java Hikvision SDK の二次開発を習得するための重要なスキルをいくつか紹介し、対応するコード例を添付します。 1. Hikvision を理解する

Windows App SDK 1.2 がオンラインになりました。新機能は次のとおりです。 Windows App SDK 1.2 がオンラインになりました。新機能は次のとおりです。 May 12, 2023 pm 06:07 PM

WindowsAppSDK は、開発者が Windows 10 (バージョン 1809 以降) および Windows 11 を使用するさまざまなデバイス間で「一貫した」機能を提供するために Windows アプリケーションで使用できるツールと API のセットです。 .NET や Windows SDK などの既存のアプリケーション タイプを置き換えるのではなく、既存のアプリケーションを補完するために使用できる統合 API ツールセットを提供するだけであることを理解することが非常に重要です。本日、Microsoft は多くの新機能を備えた Windows App SDK バージョン 1.2 をリリースしました。このリリースのハイライトはサードパーティの開発者かもしれません

SDKとは何ですか SDKとは何ですか Jan 06, 2023 pm 03:26 PM

sdkの正式名称は「Software Development Kit」、中国語で「ソフトウェア開発キット」を意味し、ハードウェアプラットフォームやオペレーティングシステム(OS)、プログラミング言語のメーカーが提供するツールのセットです。 SDK は、ソフトウェア開発者が特定のプラットフォーム、システム、またはプログラミング言語用のアプリケーションを作成するのを支援します。通常、基本的な SDK はコンパイラー、デバッガー、アプリケーション プログラミング インターフェイス (API) で構成されますが、ドキュメント、ライブラリ、ランタイム/開発環境、テスト/分析ツール、ネットワーク プロトコルなどの他のコンテンツが含まれる場合もあります。

See all articles