VC6 SDKで壁紙チェンジャーを作っています
定期的に壁紙を変更する機能が、フルスクリーンゲームに干渉して、
ゲームに異常を及ぼすことがあります。
そこで、フルスクリーンアプリケーションの有無を検出して、一時的に
その機能を停止したいのですが、検出の仕方がわかりません。
なにか方法がありましたら、ぜひ教えてください。
これを書いている時点ではテストコーディングしていないので
出来る、とは言いかねますが以下の様な方法はどうでしょう?
(起動している任意のアプリのウィンドウハンドルを取得していると言う前提です)
1.デスクトップの最大領域を取得する
2.任意のアプリのウィンドウハンドルからウィンドウサイズを取得
3.1と2のサイズが等しければ任意のアプリは最大化されている
…ではどうでしょうか
フルスクリーンアプリというのが、ウィンドウ最大化ということでしたら、
・EnumWindows で全てのウィンドウを列挙
・列挙した全てについて、GetWindowPlacement で、最大化されているかどうか判定
でできると思います。
ただ、DirectX の全画面モードだと、どう判定したらいいのかわかりません。
そう詳しくはないのですが、DirectX の画面占有は排他で行うのが普通なので、
実際に取得してみて取得できれば最大化されてないと判断するとか
出来ないでしょうか。
例えば、IDirectDraw7::SetCooprativeLevel に FULLSCREEN 指定なしで
排他(DDSCL_EXCLUSIVE)だけ指定しエラー値を見てみる。
DirectX 9 のインターフェイスだとかなりまで一括でやっちゃいますが、
DirectX 7頃の初期化では、まず協調レベルを設定(上のメソッド)して、
これが成功したら対応解像度を確認してそれに切り替えて...と
個別に判定してたと思うので、逆にチェックだけで解像度切替等しないで
解放すればちらついたりもしないんじゃないかと思います....けど。
ぽちょむきんさんの方法を試してみましたが、全画面アプリが動作していない
状態でも、WorkWやらProgmanというクラス名のWindowsの(ものと思われる)
ウィンドウが引っ掛かってしまううえ、肝心の全画面アプリが検出できず
うまくいきませんでした。
フルスクリーン(全画面)というのは、最大化ウインドウではなく
フルスクリーンエミュレートを意識してました、説明不足ですみません。
DirectXもあわせて考えると、かなり大変になりそうですね…
昔、この機能(自動変更を停止する)を持った壁紙チェンジャーを見かけた
気がしたので、何か方法があると思ったんですが…
ツイート | ![]() |