サンプルプログラムでフルスクリーンサポートを追加している間、ちょっと迷惑な振る舞いに遭遇しました。DirectX11スワップチェーンとウィンドウがフルスクリーン状態を失う
フルスクリーンウィンドウの作成は機能しますが、フルスクリーンウィンドウを含む出力上のウィンドウ(別のアプリケーションから)を移動すると、自動的にウィンドウに戻ります。
この動作を防ぐ方法はありますか?(フルスクリーンウィンドウはウィンドウに戻らないため)
参考までに、これは小さなスタンドアロンの例です(問題は簡単に複製できます)。
また、これが便利な場合は、Windows 8.1を実行しています。
私はすでに代わりに破棄のFlipSequentialを使用するのと同じ、いや成功の両方、WindowAssociationFlagsとSwapChainFlagsを変更しようとしました
SharpDX.DXGI.Factory2 factory = new SharpDX.DXGI.Factory2();
SharpDX.DXGI.Adapter adapter = factory.GetAdapter(0);
var renderForm1 = new RenderForm("Form 1");
factory.MakeWindowAssociation(renderForm1.Handle, SharpDX.DXGI.WindowAssociationFlags.IgnoreAll);
Device device = new Device(adapter, DeviceCreationFlags.BgraSupport);
SharpDX.DXGI.SwapChainDescription sd = new SharpDX.DXGI.SwapChainDescription()
{
BufferCount = 2,
ModeDescription = new SharpDX.DXGI.ModeDescription(0, 0, new SharpDX.DXGI.Rational(50, 1), SharpDX.DXGI.Format.R8G8B8A8_UNorm),
IsWindowed = true,
OutputHandle = renderForm1.Handle,
SampleDescription = new SharpDX.DXGI.SampleDescription(1,0),
SwapEffect = SharpDX.DXGI.SwapEffect.Discard,
Usage = SharpDX.DXGI.Usage.RenderTargetOutput,
Flags = SharpDX.DXGI.SwapChainFlags.None
};
var swapChain1 = new SharpDX.DXGI.SwapChain(factory, device, sd);
renderForm1.Left = 1922; //Just hardcoded here to move window to second screen
renderForm1.Width = 1920;
renderForm1.Height = 1080;
renderForm1.FormBorderStyle = FormBorderStyle.None;
swapChain1.SetFullscreenState(true, null);
swapChain1.ResizeBuffers(2, 1920, 1080, SharpDX.DXGI.Format.R8G8B8A8_UNorm, SharpDX.DXGI.SwapChainFlags.AllowModeSwitch);
var resource = Texture2D.FromSwapChain<Texture2D>(swapChain1, 0);
var renderView = new RenderTargetView(device, resource);
RenderLoop.Run(renderForm1,() =>
{
device.ImmediateContext.ClearRenderTargetView(renderView, new SharpDX.Color4(1, 0, 0, 1));
swapChain1.Present(1, SharpDX.DXGI.PresentFlags.None);
});
編集:私はまた、MicrosoftからC++のサンプル(ちょうど取らDirectX11基本的なチュートリアルを試してみました し、フルスクリーンスイッチを追加した場合)、これは同じ動作につながります。したがって、これはSharpDX特有の問題ではありません。
メッセージループを見て、これが発生すると、最初のフルスクリーンモードがウィンドウに戻され、WM_DISPLAYCHANGEメッセージが表示されます)。
好奇心のために(Windows8.1またはWindows 10を考えて)、DirectX9 Full Screenを使って同じ動作に遭遇するでしょうか? – catflier
Direct3D 9のフルスクリーンモードのエミュレート方法にはいくつかの違いがあると思いますが、Windows Vistaでは "デバイスの紛失"シナリオが実際には存在しないので、この動作も同様にエミュレートされます。同じ状況。 –
デフォルトではdx9では実際にはフォーカスが失われるとすぐに隠れますが、少なくともそれは容易に騙される可能性があるため、現時点で唯一の方法はリソースを共有するためです。 – catflier