INASOFT 管理人のひとこと


フリーソフトダウンロードサイト「INASOFT」の管理人 矢吹拓也 が日々の「ひとこと」を語るページです。
2021年1月1日より、旧ブログ(blog.inasoft.org)からお引越ししました。
・INASOFT Webサイト: https://www.inasoft.org/
・管理人のふたこと(長文記事/寄稿文): https://www.inasoft.org/talk/
本業の方のお仕事が再び忙しくなりつつあるので、断続的にしばらく更新が止まることがあります。

目次 | ←前へ / 2013-07-22 00:00 / 次へ→ / 最新へ⇒

■東方レスキュー補足記事 - 最小化時のGetWindowRectの罠1

2013/ 7/22 0:00:00


RSSRSS配信中

https://www.inasoft.org/








さて、本日は、先日公開した「東方レスキュー」に関する記事の補足でも。

東方輝針城 ~ Double Dealing Character.でも、「妖精大戦争」以降連綿と続く不具合が出ちゃっているみたいなので、一体何が起きているのか推測していました。

Windowsアプリケーションでは、利用者の利便性向上のため、プログラム終了時点のウィンドウ位置を保存し、次回起動時にそこへ復元する機能が暗黙に組み込まれることが多くあります。

たいていの場合、プログラム終了時点でのウィンドウ座標を GetWindowRect() API を用いて取得し、次回プログラム開始時に SetWindowPos() API などを用いてそれを設定している場合が多いでしょう。しかしこの方法には落とし穴があります。

ここにも書かれているとおり、ウィンドウが最小化(タスクバーに収納)されている状態で GetWindowRect() API を呼び出した場合、ウィンドウの座標として -32000 が格納されます。

で、プログラムがこれを正直に信じて保存し、次回起動時に SetWindowPos() API に設定してしまうと、ウィンドウは本当に -32000 の座標に飛ばされてしまうんですね。
画面外の、遙か彼方の座標です。

実際、東方輝針城をウィンドウモードで起動し、最小化した上で、タスクバー上のボタンを用いて終了した後に設定ファイル th14.cfg を覗いてみると、あからさまにその状態になっている様子が窺えます。(上が通常時。下が異常発生後)

thresc.png

ただ、普通に考えて、「ゲームをウィンドウモードで起動し、最小化した上で、タスクバー上のボタンを用いて終了」なんてシチュエーションが起きることは考えにくいのですが、東方Projectの作品でネットで検索すると、この手の悩みがけっこう多いんですね。
これは予想になりますが、おそらくこのゲームを、作業BGMとして、音楽プレイヤー代わりに使っている人が多いのだと思います。音楽に定評のある作品群ですから。

いちおうこの件は、だいぶ前にZUNさんにお伝えしたのですが、酒の席だったためか忘れられてしまっているみたいなんですよね。困りました…。

明日に続きます。




目次 | ←前へ / 2013-07-22 00:00 / 次へ→ / 最新へ⇒


目次の表示:


ブログではないので、コメント機能とトラックバック機能は提供していません。ご質問・ご意見等はメールフィードバックまたはTwitter等からお願いします。いただいたご質問・ご意見などは、この「管理人のひとこと」の記事に追加、あるいは新規の記事にする形で一部または全文をそのまま、あるいは加工させていただいた上で、ご紹介させていただく場合があります。
当サイトでは掲載内容による不具合等に関する責任を持ちません。また、内容の正確性についての保証もありませんので、情報をご利用の際は、利用者の自己責任で確認をお願いします。本ページは公開から1年半後の任意のタイミングで削除される予定です。




2554485 (+0185)[+0573]

Copyright© 2010-2021 INASOFT