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(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 サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

Dreamweaver Mac版
ビジュアル Web 開発ツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

Safe Exam Browser
Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

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