2009-03-26 3 views
0

D3DまたはOpenGLをWindowsでフルスクリーンに表示する場合、この奇妙な動作に気付いたことはありますか?これは、アプリケーションが全画面表示になった後、ウィンドウに戻るか終了するときにのみ適用されます。それらは、他のアプリケーションのウインドウ位置をシャッフルします(私が単一モニタマシン上にいるとき)、または複数のモニタマシン上にいるとき、他のすべてのアプリケーションウインドウを別のスクリーンに移動します。解像度を変更するときに他のアプリケーションウィンドウのサイズと位置を保持する方法は? (例えば、デスクトップ以外の解像度でフルスクリーンゲームを行う場合)

この2つの異常を表示していないアプリケーションがない場合は、これを当然のことと考えています。だから、私の疑問は、これらの2つの問題を緩和するためにアプリケーションを書くときに、世の中が本当に必要とするものでしょうか?また、この問題がWindows以外のプラットフォームにも存在するかどうかはわかりません。

これについての私の主なセットアップはOpenGL/C++ですが、これは、プラットフォームAPIのように見えるので、これはあなたの設定に関係します。


編集は:OK、ここに私の観察にいくつかのより明確です。デスクトップと同じ解像度でも問題は解決されません。デスクトップと同じ解像度になっていなくても、スイッチバックすると、デスクトップ上のウィンドウは以前と同じように復元されます。アプリケーション/ゲームは、デスクトップと同じ解像度になっていなくても復元できます。全画面アプリケーションが実行されました。


EDIT2:それは解像度スイッチの問題であるように見え、Windowsの(少なくともXP)は、アプリケーションウィンドウの(複数のモニタ設定の場合)位置とサイズを覚えていないようです。たとえOSが提供しなければならないようなものであっても、少なくともAPI呼び出しとして、あるいは2つとして、私が質問への回答で提供したのは解決策のように見えます。私はまだこれが唯一の解決策であると確信していません。優雅で簡単な修復の簡単な方法が必要ですか?

+0

解像度が変更されたためですか? –

答えて

1

私はあなたが経験している状況について100%確信しているとは言えません。しかし、パフォーマンス上の理由から、ほとんどのD3D/OpenGLゲームが起動/シャットダウン時にマシンの解像度を変更するため、私の推測はそうです。

あなたの現在の設定で実行できる可能性があるため、ウィンドウをシャッフルしないと見えるものは解像度を変更しない可能性があります。

+0

よろしくお願いします。これは解像度に関するものではなく、復元前と復元後のデスクトップ/ウィンドウのサイズと位置を「覚えている」ものです。 – Keyframe

0

私はこれについてさらに調査しました。解像度を変更した後に実行中のすべてのウィンドウのサイズと位置を復元するためのデフォルトのフォールバックはないようです。アプリケーション内から実行する必要があります(少なくともXPで)。

ので、優雅に戻って他の解像度(例えば、フルスクリーンゲーム)から復帰するためには、私がEnumWindows、適切なコールバックを持つすべての実行中のアプリケーションのhWnd年代を取得し、中GetWindowRect経由でWindows RECT構造体のそれぞれを格納する必要がありますリスト。

デスクトップの解像度に戻すと、もう一度EnumWindowsを実行しますが、フルスクリーンに切り替える前に保存したRECTのリストを使用して、実行中のアプリケーションウィンドウの位置とサイズをSetWindowPosで設定するコールバックが異なります。

を見ているようにあなたはそれも唯一のAPIた場合、OSは、そのような機能を提供していないことを奇妙に思えるだけEnumWindowsなどによるウィンドウのHWNDを取得し、勿論、落とし穴年代があります。他のOSがこれをどのように処理しているのだろうか。

2

ChangedDisplaySettingsEx(..., CDS_FULLSCREEN, NULL)を使用しないでください。それは解決交換が一時的であることをシステムに伝えるでしょう。

+0

これを処理するには、CDS_FULLSCREENを使用するのが正しい方法です。それにより、他のウィンドウの位置とサイズは変更されず、プロセスが終了すると自動的に元の表示モードに戻ります。 – efotinis

関連する問題