何かしら常駐アプリを作った時*1、「DirectXを利用したフルスクリーンのゲームが動いているときは、特定の処理を行いたくない!」というケースが発生する事があります。フルスクリーンで集中して遊んでいる中、突然謎の音が鳴ったり、謎の通知ウィンドウが出てきては困ってしまいますからね。(という事で、この記事のタイトルとしては「フルスクリーンゲームを検出して邪魔をしないようにするには?」が正解です。^^;)
さて、どうにか検出したい所なのですがー…これ、考え方が色々あって 且つ 実験してみないとわからない部分が合ったりと、なかなか大変なんですよねー。
この問題について、自分なりに検討・実験してみました。
フルスクリーン DirectX なゲーム中の検出を頑張ってみる
恐らく誰もが考えるであろう「DirectX Graphics の フルスクリーンモード検出方法」として
- 実際にデバイス作ってみて、作成し失敗したら「ゲーム起動中」としようか。
という手順は「…でも、ソコまで実装するのー? DirectX Graphics の初期化マジ面倒。」 てな感じで、実装するのタルイってことで敬遠してる人も多いかと思います。まぁ私のことなんですケド(ぉ。 ただマジレスすると、フルスクリーンを検出するのにソコまでやるのもなんか変な感じもします。初期化で CPU かなり食いますし。
もっと手軽な方法は無いものでしょーかと。
そんな中、知人の開発者さん*2に 伊勢的新常識 なるページを紹介していただきまして 「おぉ!こりゃ使える!!」 とか思ったのです。 …が、実際には上手く動作してくれませんでした。^^;
DirectXのフルスクリーンの場合はアクティブウィンドウ以外のウィンドウが全部非表示になっているようです。
との事なんですけど……IsWindowVisible が true を返すウィンドウを一定時間ごとに列挙するアプリを走らせつつ、ゲーム実行してみたんです。 そしたらですね…
ALiBAT Ver1.0A Visible // フルスクリーンゲーム libcheck_fullscreen (実行中) - Microsoft Visual Studio Visible Dialog Visible // ウィンドウ列挙アプリ Sleipnir - [二次元裏@ふたば] Visible MSDN ライブラリ Visual Studio 6.0 Visible Visual Studio .NET 2003 連結コレクション - Visual Studio .NET 連結ヘルプ コレクション Visible (None) Visible Program Manager Visible
全力で表示ウィンドウが残ってるんですね。 orz
ちなみに、ぷよフィ起動中でも列挙されちゃいました。
そして悩んでみる
じゃぁ、どうするべきかと悩む訳ですが…うーん……
仮の話…でもなく実際の私の環境の話なんですけど、ここにフルスクリーンになる2つのアプリケーションがあります。
1つは、開発する上での問題を沢山抱えている Visual Studio 2005
1つは、私が何気にハマっている アリバト さん
後者の場合は、ゲームに集中する故に邪魔するような処理は行わないようにするべきですが、前者の場合は(作業に集中しているかもしれませんが)メールの着信通知ような軽度の割り込み処理はあっても良いハズです。
で問題は、両方とも「1024 x 768」*4&&「フルスクリーン」です。
……どないせいっちゅーねん。(ぉ orz
ただ、DirectX を利用したゲームはウィンドウに WS_EX_TOPMOST がつくようなのですよ。
ここでよくよく考えてみると、ゲームに限らず「TOPMOST」&&「フルスクリーン」なウィンドウとは「そのウィンドウに対するタスクに集中してもらう為に 他のタスクは一切割り込んでくるな!」みたいなニュアンスがあると思ってみたわけです。
ほんなら、
- デスクトップ以上のウィンドウのサイズ
- WS_EX_TOPMOST なウィンドウ
が存在した場合は、割り込み処理を行わないようにするべきだろうか。確かにコレでもある程度満足するような気がします。
…が、おそらく WS_EX_TOPMOST 無しで初回起動時のみZオーダーを最前面にする「なんちゃって TOPMOST ウィンドウ(当然 ATL + TAB で切り替えると他のウィンドウが前に来る)」もきっと世の中に存在するワケで…
うーん…
思うに「フルスクリーン時にポップアップ通知みたいなのは割り込み処理はOKか否か」ってのは、アプリケーション そして 使っている人によって違ってくるとは思うので、ある程度は目を瞑るべきなのかなぁー…とか思ってみますが……
今の所、上記の WS_EX_TOPMOST なフルスクリーン時を検出するようなモノで十分ではないかと思ってますが、本当はどーするべきなのかしら〜…