Mi sono appena imbattuto in questo piccolo comportamento fastidioso, mentre aggiungevo il supporto a schermo intero su un programma di esempio.DirectX11 Swapchain e finestra che perdono lo stato a schermo intero
La creazione di una finestra a schermo intero funziona, ma non appena si sposta una finestra (da un'altra applicazione) sull'output che contiene la finestra a tutto schermo, torna automaticamente a finestra.
C'è un modo per evitare questo comportamento (quindi la finestra a schermo intero non torna alle finestre)?
Come riferimento, questo è un piccolo esempio indipendente (quindi il problema può essere facilmente replicato).
Inoltre, se ciò è utile, sono in esecuzione su Windows 8.1.
Ho già provato a cambiare WindowAssociationFlags e SwapChainFlags, entrambi senza successo, stessa cosa che usare FlipSequential invece di Gettare
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);
});
Edit: Ho anche provato un campione C++ (appena preso tutorial di base DirectX11 di Microsoft e aggiunto switch a schermo intero), questo porta allo stesso comportamento, quindi questo non è un problema specifico di SharpDX.
Ho guardato il ciclo dei messaggi, e una volta che questo si è verificato, la prima modalità a schermo intero è tornata a finestra, e ricevo un messaggio WM_DISPLAYCHANGE).
Grazie per la grande risposta dettagliata, per curiosità (pensando a windows8.1 o windows 10), si incontrerebbe lo stesso comportamento usando DirectX9 a schermo intero (non che io abbia intenzione di tornare indietro ad esso, ma curioso al riguardo)? – catflier
Penso che ci siano alcune stranezze nel modo in cui viene emulata la modalità a schermo intero Direct3D 9 - ricorda che gli scenari di "dispositivo perso" non esistono realmente su Windows Vista +, quindi anche questo comportamento viene emulato--, ma credo che sia fondamentalmente la stessa situazione. –
Per impostazione predefinita in dx9 è in realtà peggio, dal momento che perde lo stato attivo si nasconde, ma almeno può essere facilmente ingannato, quindi sembra che per ora l'unico modo sarà la risorsa condivisa ad esso ... – catflier