update 2003.11.12 第4回

YS6 EXP Viewerの制作過程


第4回 タイトルバーの書き換え
さて、前回まで連続でプロセスメモリの読み書きを扱ってきましたが、今回はほんの少しだけ難易度低めに、
ウインドウ上部のタイトルバーの書き換え方を説明します。

タイトルバーが何かわからない…という人はあんまり居ないと思いますが、
とりあえずこの講座で説明しているYS6EXPVをダウンロードして使ってください。
使用前と比べて内容が変わってる個所がタイトルバーです(ぉ

方法
任意のアプリケーションの内容を書き換える…と言うと、プロセスメモリ書き換えが関わるように思えますが、
内容を参照したり、書き換えるだけであればプロセスメモリを意識することはありません。
例えばMFCを使ったアプリケーションの場合、自分自身のタイトルを書き換える場合は、
	SetWindowText("変更したいタイトルを書くと、それに変わる〜");
これをボタンコントロールのメンバ関数に記述すると、ボタンを押すことでタイトルバーの内容が変わります。
自身のウインドウ以外を書き換える場合は、
	::SetWindowText(ウインドウハンドル,"変更したいタイトルを書くと、それに変わる〜");
と、こんな感じになります(自身のウインドウハンドルは m_hWnd に定義されています)。
つまりこの場合、ウインドウハンドルさえ分かれば任意のウインドウを書き換えることが出来、
その制御は自分自身だけでなく他のアプリケーションのウインドウにも作用します。
ただ、書き換えた場合に不具合が出るようなソフトも無いとは言い切れませんので、
注意してご使用ください(まあ「書き換え」という内容は軽々しくやるものではないので)。

あと、いまさらのように説明しますがYS6EXPVはダイアログベースアプリケーション(MFC)です。
起動直後にShowWindow(SW_HIDE);でダイアログを隠す「ちょっとダメな方法」を使ってます(死
本来ダイアログを全く使わないYS6EXPVのようなツールでは描画は一切行わず、
メインのメッセージループとタスクアイコン処理のみで構成するほうが非常〜〜にスマートです。
(ま、要するにダイアログベースから組むのが一番簡単なんですが…)。

YS6EXPVの場合>
ではウインドウハンドルを取得する方法を説明するにあたって、YS6EXPVのルーチンも説明します。
まず、他のアプリケーションのウインドウハンドルを取得するには FindWindow を使用します。
	HWND hWnd_ys6=FindWindow("Falcom",NULL);
FindWindowはクラス名もしくはタイトル名を指定し、該当したウインドウのハンドルを返します。
イース6以外にファルコム作品を同時起動しないということを前提にしているため、
ファルコム特有のクラス Falcom を指定していますが、もっとちゃんと判別したい方は、
もっとウインドウハンドル取得処理を正確化すればいいかもしれません。

さて、ではウインドウハンドルが取得できたのでタイトルバーの書き換えを行いますが、
まず文字型配列 cChangeTitlebar に元のイース6のタイトルを書き込みます。
続いてレベルや経験値などの情報を文字列データにした後、タイトルバーを書き換えます。
	::SetWindowText(hWnd_ys6,cChangeTitlebar);
実際には丸ごと書き換えてるんですが、タイトルバーに経験値などのパラメータが追記されたように見えます。
1秒ごとにこの内容を更新すればリアルタイムモニタの完成です。

余談
上で少しだけ説明した「元のイース6のタイトルを書き込む」という部分。
YS6EXPVではプログラムにイース6の元々のタイトルが予め格納されています。
プログラム終了時にそれを書き込んで終了することで元に戻ったように見えるわけです。

自分自身で組める方は「だったらGetWindowText(hWnd_ys6,cTitleInit)で取得したほうが格好良い!」
と思われるかもしれませんが、リアルタイムでウインドウ状態を判別する処理時間や、
イース6を再起動した際に情報を再取得する手間を考えれば、
格好の良し悪しに必ずしもこだわる必要は無い気がしますねぇ。

そんなわけで
次回はタスクアイコン常駐アプリケーションの作り方です。
YS6EXPVではタスクアイコンは「単なるバージョン表示&終了用」なので、
あんまり参考にならないかもしれませんが、まあ気分ですね。

>>第5回に続く