僕が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」もちゃんと無視していました。うーん、どうやってやってるんだろうか....。
結局、わかりませんでした(なんやそれ)。 もうひとつ考えられる原因は、Alt+Tabに対してコンポーネントが反応しているということなのですが、 ざっとソースを見たところそれらしきところはないし...(僕の目もあてにはなりませんが) うーーーーーーむ。 ということで、この原因について詳しい方がいらっしゃれば なにかアドバイスお願いします。ホント、細かいことなんだけどなぁ......。
|
※DirectXゲーム 製作中の「二代目 NaGu-Ru」のこと。
※DirectX7
※DirectInput
※ジャック
※Alt+Tab
|