Alt+TABなんて邪魔! 99/12/27

僕がDirectXゲームを作ってて少し気になったことです。

DirectX7のDirectInputの新機能に、キーボードデバイスの排他的アクセスという、 聞いただけではよくわからない機能があります。これはキーボードが押されれるのを ほかのプロセス(アプリケーション)にまったく関知されずに、完全にキーボードを ジャックしてしまうというものなんです。 しかし、セキュリティの都合上かどうか知らないけど、 なぜか「ALT+TAB」と「Ctrl+Alt+Delete」には反応するようになってるんです。 「Ctrl+Alt+Delete」は強制終了コマンドだからもしものときにとっておくのは いいものの、Alt+Tabは必要ないでしょ。特にフルスクリーンのときにこれ おしちゃうとやばいことがあるし(詳しくは右を参照)。

また、Alt+TabじゃなくてもAlt,F10などが押されると、 タイトルバーを持っているウィンドウはアクティブになってしまうんです(ぽくむら調べ)。 しかも、WM_SYSKEYDOWNメッセージが送られてくるので、OnIdleのっとりがたゲームでは メインループがとまってしまいます。そのため、何も描画されていないウィンドウが表示され みっともない格好になってしまいます。 「ならタイトルバー消せよ、フルスクリーンゲームには必要ねーじゃん」とか思われる方を いると思いますが、起動時にいきなりフルスクリーンになるタイプじゃないゲームでは タイトルバーをつけておくのが普通です(多分)。

「それじゃぁ、無視しますか」ということになります。 幸い僕は、AltやF10などのキーが押されると ウィンドウズは「WM_SYSKEYDOWN」というメッセージを送ってくるのをどういうわけか 知っているので、このメッセージをのっとってやればいいな、と考えました。 方法としては、TFormからWMSysKeyDownを継承して コードを書かなければいいだけです。inheritedとかももちろん書いてはいけません。 こうすることによって、Alt,F10,Alt+F4などを無視することができます(できました)。 注意としてはちゃんとアプリケーション終了コマンドをつけておくことです。こうしないと Ctrl+Alt+Deleteで終わる羽目になります。気をつけてくださいね。

さて、ある程度無視することに成功しました。 しか〜し!!肝心のAlt+Tabが反応してしまっているではありませんか!! これじゃだめだ。ということで、次はDirectDrawに原因があるのではと IDirectDraw.SetCooperavtiveLevelに目を向けてみました。 この関数は、ウィンドウズとの仲良し度を設定する関数です(なんじゃそりゃ...)。 たぶん。詳しく説明すると、排他モードっていうシステム全体に及ぶような操作を実行できるモードの 設定を行うことなんだってさ(手元のDirectX解説本による)。この関数のフラグをぽちぽちと いじると、仲良し度を変えられるって寸法です。だから、僕はこのフラグを 「ウィンドウズなんて嫌い」とやってやれば、なんとかなるかな〜と考えたわけです。

いろいろとフラグをいじくってたら、Ctrl+Alt+Deleteを無視することができました。 って違うやん!!俺が無視したいのはAlt+Tabだっちゅうに!! ...要するに、このフラグをいじってみてもAlt+Tabは無視できなかったんです。 そこで僕が思ったのは「....あっ、無理なのかも」

そんははずはない、と思っていろいろとDirectXフルスクリーンゲームを起動してみました、 たいていのアプリケーション(特にアマチュア作品)は、やはりAlt+Tabに反応してしまっていました。 しかし、ちゃんと無視してるのもいるんですよ。やっぱり、無視できるんですよ。 あの有名な「BM98」もちゃんと無視していました。うーん、どうやってやってるんだろうか....。

結局、わかりませんでした(なんやそれ)。
VCLのソースを眺めてみても、特に特別なことはしていないと思ったんですが。 ところどころ気になるところをコメントアウトしてコンパイルしてみても(いいのかよ) だめでした。

もうひとつ考えられる原因は、Alt+Tabに対してコンポーネントが反応しているということなのですが、 ざっとソースを見たところそれらしきところはないし...(僕の目もあてにはなりませんが) うーーーーーーむ。

ということで、この原因について詳しい方がいらっしゃれば なにかアドバイスお願いします。ホント、細かいことなんだけどなぁ......。

※DirectXゲーム
製作中の「二代目 NaGu-Ru」のこと。

※DirectX7
MicrosoftR DirectXR Foundation is a set of low-level application programming interfaces (APIs) for creating games and other high-performance multimedia applications. It includes support for two-dimensional (2-D) and three-dimensional (3-D) graphics, sound and music, input, force feedback, and network communication for applications such as multiplayer games.
DirectXファウンデションは、ゲームやハイパフォーマンスマルチメディアアプリケーションを開発するための低レベルAPIセットです。 2D,3Dグラフィックス、音声や音楽、入力、フォースフィードバックや、マルチプレーゲームのようなネットワークコミュニケーションを サポートしています、という直訳しただけではよくわからないもの。 要はこれに対応させておけばある程度ゲームを高速に動かしてくれるという夢のテクノロジ。

※DirectInput
DirectXファミリーのなかでキーボードをはじめとする入力装置からの入力を受け取るもの。

※ジャック
ここでは「のっとる」って意味でつかっている。

※Alt+Tab
ウィンドウを持つアプリケーションを切り替えることができるコマンド。 フルスクリーンゲームの敵である。 フルスクリーンゲーム起動中に切り替えると ディスプレーの解像度が変更されてしまうからだ。エラーが出ることもある。






もどる