ホームページ  >  記事  >  運用・保守  >  Win32 SDKの基礎(8) Windowsメッセージの仕組みを詳しく解説(図)

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

黄舟
黄舟オリジナル
2017-06-06 10:02:153918ブラウズ

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 オブジェクトを格納すると理解できます (Dequeaee932e3af002b763748cf2e999e819c)。メッセージ キューには 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 までご連絡ください。