ProcessMessageについてちょっとした疑問があります

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
PUMP
記事: 23
登録日時: 4年前

ProcessMessageについてちょっとした疑問があります

#1

投稿記事 by PUMP » 3年前

ゲームのメインループは、ProcessMessageで「ウィンドウの×ボタンが押された時にループを抜ける」という風にしてあるのが基本のようですが
例えば次のようなプログラムがあったとして

コード:

#include "DxLib.h"

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int) {
	ChangeWindowMode(true);
	DxLib_Init();

	while (ProcessMessage() == 0) {
	}

	WaitKey();
	DxLib_End();
	return 0;
}
ウィンドウ×ボタンを押すとProcessMessageに0以外が返される、条件式にはまらなくなるのでループを抜ける、その後WaitKeyでキーを押さないと終了できない...となると予想していたのですが
ウィンドウの×ボタンを押すとすぐに終了してしまいます。

気になったんですが、これはどういう仕様でなっているのでしょうか?
もし「×ボタン = 強制終了ボタン = WaitKeyは実行されない」 ということでしたら、DxLib_Endも実行されていないということですかね?

アバター
amehirune
記事: 181
登録日時: 6年前
住所: どっか
連絡を取る:

Re: ProcessMessageについてちょっとした疑問があります

#2

投稿記事 by amehirune » 3年前

面白い話だなーと思ったので実験してみました。

コード:

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int) {

	FILE *fp;
	fp = fopen("Mlog.txt","w");

    ChangeWindowMode(true);	fprintf(fp,"起動プロセス:ウィンドウモードに変更\n");
    DxLib_Init();			fprintf(fp,"起動プロセス:Dxライブラリの初期化に成功\n");
 
    while (ProcessMessage() == 0) {
    }

	fprintf(fp,"プロセスメッセージより0以外の値が返されました\n");
 
    WaitKey();		fprintf(fp,"終了プロセス:何かキーが押されるまで待機しています\n");
    DxLib_End();	fprintf(fp,"終了プロセス:Dxライブラリの終了処理を行いました\n");
	fclose(fp);
    return 0;
}
各重要点にチェックポイントを設け、処理をさせてみました。
すると、以下のようなログファイルが出力されました。
起動プロセス:ウィンドウモードに変更
起動プロセス:Dxライブラリの初期化に成功
プロセスメッセージより0以外の値が返されました
終了プロセス:何かキーが押されるまで待機しています
終了プロセス:Dxライブラリの終了処理を行いました
きちんとWaitKeyも実行され、Dx_endも実行されているのが確認できます。
因みに、なぜこうなったのかを説明しておきますと、
WaitKey関数は実は「キーボードからの入力待ち」ではなく、ただ単純に「入力待ち」なんです。
実はこれ、マウスクリックにも反応して、それでWaitが解除されてしまうんです。
恐らく、×ボタンもウィンドウの中に入っているので、
プロセスを抜ける→そのとき×ボタンを押している→WaitKeyも反応→即座に終了
という流れを踏んでいるのではないかと推測されます。
間違っていたらごめんなさい。
ほら、来いよ!! 誤字や矛盾を指摘したい奴から、前に出てこいよぉおおおおおおおッ!!!
※都合により、不定期でしか現れません。即返などはできませんのでご了承ください※

アバター
プラム
記事: 164
登録日時: 6年前
住所: 東海地方

Re: ProcessMessageについてちょっとした疑問があります

#3

投稿記事 by プラム » 3年前

PUMP さんが書きました: ゲームのメインループは、ProcessMessageで「ウィンドウの×ボタンが押された時にループを抜ける」という風にしてあるのが基本のようですが
例えば次のようなプログラムがあったとして
ウィンドウ×ボタンを押すとProcessMessageに0以外が返される、条件式にはまらなくなるのでループを抜ける、その後WaitKeyでキーを押さないと終了できない...となると予想していたのですが
ウィンドウの×ボタンを押すとすぐに終了してしまいます。
気になったんですが、これはどういう仕様でなっているのでしょうか?
もし「×ボタン = 強制終了ボタン = WaitKeyは実行されない」 ということでしたら、DxLib_Endも実行されていないということですかね?
すごく面白い発想ですね、僕は考えたことがなかったです。
これはすごく良い発想だと思います。そこの場所に処理を追加することで、自動セーブ機能を作ったりすることもできますしね。
amehirune さんが書きました: 各重要点にチェックポイントを設け、処理をさせてみました。
すると、以下のようなログファイルが出力されました。
起動プロセス:ウィンドウモードに変更
起動プロセス:Dxライブラリの初期化に成功
プロセスメッセージより0以外の値が返されました
終了プロセス:何かキーが押されるまで待機しています
終了プロセス:Dxライブラリの終了処理を行いました
きちんとWaitKeyも実行され、Dx_endも実行されているのが確認できます。
因みに、なぜこうなったのかを説明しておきますと、
WaitKey関数は実は「キーボードからの入力待ち」ではなく、ただ単純に「入力待ち」なんです。
実はこれ、マウスクリックにも反応して、それでWaitが解除されてしまうんです。
恐らく、×ボタンもウィンドウの中に入っているので、
プロセスを抜ける→そのとき×ボタンを押している→WaitKeyも反応→即座に終了
という流れを踏んでいるのではないかと推測されます。
間違っていたらごめんなさい。
僕もamehiruneさんが言っているように、クリックに反応して、処理が通ったんだともいます。
もしEscが押されたときに終了したいのであれば

コード:


#include "DxLib.h"
 
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int) {
    ChangeWindowMode(true);
    DxLib_Init();
 
    while (ProcessMessage() == 0){}

	while(CheckKeyInput(KEY_INPUT_ESCAPE)==0){}

    WaitKey();
    DxLib_End();
    return 0;
}

などとやってみると良いと思います。

アバター
usao
記事: 1566
登録日時: 6年前

Re: ProcessMessageについてちょっとした疑問があります

#4

投稿記事 by usao » 3年前

DXライブラリを使ったことないですが…
ググると,リファレンスでは

・WaitKey()はProcessMessage()を実行している
・ProcessMessage()はウィンドウが閉じられたら-1を返す

ということみたいです.
問題にしている 10行目のWaitKey()の時点では,既にウィンドウが存在していないから
WaitKey()が所望の動作をしないというだけのことなのではないでしょうか.

PUMP
記事: 23
登録日時: 4年前

Re: ProcessMessageについてちょっとした疑問があります

#5

投稿記事 by PUMP » 3年前

リファレンスページに書いてあるとは...盲点でした...
やっと動的確保を勉強し始めたところで、「もしかしてこれ解放できてない!?」と深読みしまして(^^;
普通に処理でいてるようで、安心しました。 ありがとうございます。

閉鎖

“C言語何でも質問掲示板” へ戻る