我只是偶然發現了這個小惱人的行爲,同時在示例程序中添加了全屏支持。DirectX11 Swapchain和窗口失去全屏狀態
創建一個全屏窗口可以工作,但只要我在包含全屏窗口的輸出中移動任何窗口(來自另一個應用程序),窗口就會自動切換回窗口。
有什麼辦法來防止這種行爲(所以全屏窗口不會回到窗口)?
作爲參考,這是一個小的獨立示例(因此可以輕鬆地複製問題)。
此外,如果這是有用的,我在Windows 8.1上運行。
我已經試圖改變WindowAssociationFlags和SwapChainFlags,都沒有成功,像使用的,而不是丟棄FlipSequential
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);
});
編輯: 我也嘗試了C++的樣品(剛剛拍攝的DirectX11基礎教程微軟和添加全屏切換),這導致了相同的行爲,所以這不是SharpDX的特定問題。
我查看了消息循環,一旦發生這種情況,第一個全屏模式將變回窗口狀態,並且我收到一條WM_DISPLAYCHANGE消息)。
感謝您的好奇心(思考windows8.1或windows 10),你會遇到同樣的行爲使用DirectX9全屏(不是我打算回滾到它,但好奇它)嗎? – catflier
我認爲在模擬Direct3D 9全屏模式方面存在一些怪癖 - 請記住,「丟失的設備」方案在Windows Vista +上並不存在,因此此行爲也被模擬 - 但我相信它基本上同樣的情況。 –
默認情況下,在dx9中它實際上更糟糕,因爲只要它失去了焦點,它就會隱藏自身,但至少它可以很容易被欺騙,所以現在似乎唯一的方法將是共享資源回到它... – catflier