フルスクリーンの検出について検討してみる。

何かしら常駐アプリを作った時*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
ちなみに、ぷよフィ起動中でも列挙されちゃいました。

というわけで、伊勢的新常識 を書かれた中の人には申し訳ないんですが、そのアプローチはチトダメっぽいです。^^;*3

そして悩んでみる

じゃぁ、どうするべきかと悩む訳ですが…うーん……

仮の話…でもなく実際の私の環境の話なんですけど、ここにフルスクリーンになる2つのアプリケーションがあります。


1つは、開発する上での問題を沢山抱えている Visual Studio 2005
http://ir9.jp/hd/hd060821_00.png

1つは、私が何気にハマっている アリバト さん
http://ir9.jp/hd/hd060821_01.jpg



後者の場合は、ゲームに集中する故に邪魔するような処理は行わないようにするべきですが、前者の場合は(作業に集中しているかもしれませんが)メールの着信通知ような軽度の割り込み処理はあっても良いハズです。

で問題は、両方とも「1024 x 768」*4&&「フルスクリーン」です。



……どないせいっちゅーねん。(ぉ orz



ただ、DirectX を利用したゲームはウィンドウに WS_EX_TOPMOST がつくようなのですよ。

ここでよくよく考えてみると、ゲームに限らず「TOPMOST」&&「フルスクリーン」なウィンドウとは「そのウィンドウに対するタスクに集中してもらう為に 他のタスクは一切割り込んでくるな!」みたいなニュアンスがあると思ってみたわけです。


ほんなら、

  • デスクトップ以上のウィンドウのサイズ
  • WS_EX_TOPMOST なウィンドウ

が存在した場合は、割り込み処理を行わないようにするべきだろうか。確かにコレでもある程度満足するような気がします。

…が、おそらく WS_EX_TOPMOST 無しで初回起動時のみZオーダーを最前面にする「なんちゃって TOPMOST ウィンドウ(当然 ATL + TAB で切り替えると他のウィンドウが前に来る)」もきっと世の中に存在するワケで…



うーん…



思うに「フルスクリーン時にポップアップ通知みたいなのは割り込み処理はOKか否か」ってのは、アプリケーション そして 使っている人によって違ってくるとは思うので、ある程度は目を瞑るべきなのかなぁー…とか思ってみますが……


今の所、上記の WS_EX_TOPMOST なフルスクリーン時を検出するようなモノで十分ではないかと思ってますが、本当はどーするべきなのかしら〜…

余談

あまちゅあプログラマ的に、アリバトさんは感動しました。何がって、セットアップ時に Windows Installer を使っていた事が!

えぇなえぇなー、このインストーラー使うだけで アプリの価値が「グッ」と上がる気がするんですよ私。如何にもそのサークルさん「公式」って感じが出て。


私も使ってみたいんですけどねー。ねー。ねー…。

はは…ドキュメントが英語だぜ……


※ゲームの中身的にもすごいです。 綺麗な曲線が描けてました……すごい…

*1:うち等のサークルで言う「薔薇乙女メールチェッカー」みたいな

*2:いや本職は違うようですけど

*3:GetWindow が問題とか?いやよくわからんけど。私は EnumWindows で実装してみました。

*4:普段の作業は 1152x864