>> WINAPI入門トップに戻る

メッセージループ

今回はメッセージループについて説明します。
最初の講座で、Windowsはメッセージをやり取りして、
アプリケーションを動かしていると説明しました。
このメッセージを受け取って、ウィンドウプロシージャに渡すところまでの処理を
メッセージループと言います。
今回はこの部分の処理について説明します。

メッセージを受け取るにはGetMessage関数を使う必要があります。
この関数は以下のような仕組みになっています。

BOOL GetMessage(
LPMSG lpMsg, // メッセージ情報
HWND hWnd, // ウィンドウのハンドル
UINT wMsgFilterMin, // 最初のメッセージ
UINT wMsgFilterMax // 最後のメッセージ
);

第一引数には、MSG構造体のポインタ
第二引数には、ウィンドウハンドル
第三引数と、第四引数は取得対象メッセージの最小値と最大値を指定しますが、
この二つは0を指定しておけばよいです。
この関数は、WM_QUITというメッセージを受信した場合は0を返し、
それ以外のメッセージを取得した場合は0以外の値が返り、MSG構造体の中に該当メッセージの
情報が格納されます。
失敗した場合はー1が返ります。

この関数でメッセージを受け取った後は、ウィンドウプロシージャにそのメッセージを渡してやる必要があります。
その為に使う関数が、DispatchMessage関数です。
この関数にはMSG構造体のポインタを渡してやります。

メッセージはアプリケーション起動中は永遠に発生するので、
常に処理をループさせてメッセージを受け取る必要があります。
GetMessage関数はもしメッセージがなかった場合は待機するので、
CPUが高負荷になる恐れもありません。
そのループ処理を実現したのが以下のコードになります。

	int check;
	while(check=GetMessage(&msg,NULL,0,0)){
		if(check==-1){
			break;
		}
		DispatchMessage(&msg);
	}

while文の条件式の中で、GetMessage関数の戻り値をcheck変数に入れています。
もしWM_QUITのメッセージを受信した場合は、0が変えるのでループを抜けることになります。
それ以外のメッセージの場合は、次のif文に処理が移ります。
戻り値がー1かどうかを調べてエラーならループを抜けるようにしています。
エラーじゃなければその下のDispatchMessage関数を実行し、ウィンドウプロシージャにメッセージを渡す、
という流れになっています。

以上が、メッセージループの説明になります。
次回はこのメッセージを渡した先。
つまりウィンドウプロシージャの説明を行います。


>> 【ウィンドウプロシージャ】に進む
>> WINAPI入門トップに戻る