在ToggleFullScreen返回窗口后,单个游戏崩溃

本文关键字:单个 游戏 崩溃 ToggleFullScreen 返回 窗口 | 更新日期: 2023-09-27 18:13:16

与Monogame我能够切换到全屏模式使用ToggleFullScreen没有任何问题,但当我试图切换回窗口模式我得到这个:

SharpDX。SharpDXException未处理HResult=-2005270527
Message=HRESULT: [0x887A0001], Module: [SharpDX.]ApiCode DXGI):[DXGI_ERROR_INVALID_CALL/InvalidCall],消息:应用程序做了一个呼叫无效。调用的参数或状态关于某件事是不正确的。启用D3D调试层以便通过调试消息查看详细信息。

=异常堆栈SharpDX来源:在SharpDX.Result.CheckError ()在SharpDX.DXGI.SwapChain。ResizeBuffers(Int32 bufferCount, Int32宽度,Int32高度,格式newFormat, SwapChainFlagsswapChainFlags)Microsoft.Xna.Framework.Graphics.GraphicsDevice.CreateSizeDependentResources(布尔useFullscreenParameter)在Microsoft.Xna.Framework.GraphicsDeviceManager.ApplyChanges ()在Microsoft.Xna.Framework.GraphicsDeviceManager.ToggleFullScreen ()

下面是一些代码:

private GraphicsDeviceManager graphics;
private Vector2 baseScreenSize = new Vector2(1280, 720);
public Game1() {
   graphics = new GraphicsDeviceManager(this);
}
protected override void Initialize() {
   base.Initialize();
   GraphicsDevice.SamplerStates[0] = SamplerState.PointWrap;
   //Work out how much we need to scale our graphics to fill the screen
   float horScaling = GraphicsDevice.PresentationParameters.BackBufferWidth / baseScreenSize.X;
   float verScaling = GraphicsDevice.PresentationParameters.BackBufferHeight / baseScreenSize.Y;
   Vector3 screenScalingFactor = new Vector3(horScaling, verScaling, 1);
   globalTransformation = Matrix.CreateScale(screenScalingFactor);
}
public void ToggleFullScreen() {
   graphics.ToggleFullScreen();
}

ToggleFullScreen方法正在从窗体上的按钮被调用。

这个异常是什么意思,我如何修复它?


编辑:

进一步的测试表明…我在更新方法中设置了按下F键时的开关:

protected override void Update(GameTime gameTime) {
            if (Keyboard.GetState().IsKeyDown(Keys.F)) {
                if (!debounce) { graphics.ToggleFullScreen(); debounce = true; }
            }
            else
                debounce = false;
}

这是可行的!我可以从全屏模式切换到全屏模式

但我希望能够切换模式,从一个窗口的形式与用户单击一个按钮。但是由于上面的代码工作,我想也许这只是在更新方法中调用。所以我试着这样做:

private bool shouldToggleFullscreen = false;
public void ToggleFullScreen() {
   shouldToggleFullscreen = true;
}
protected override void Update(GameTime gameTime) {
   if(shouldToggleFullscreen) {
      graphics.ToggleFullScreen();
      shouldToggleFullscreen = false;
   }
}

这行不通。我得到与上面相同的错误。

我刚找到答案。这是因为游戏不是活动窗口。现在我只需要找出如何给它聚焦。

在ToggleFullScreen返回窗口后,单个游戏崩溃

问题是,我试图切换全屏模式,而窗口没有集中(为什么这是一个问题,我不确定)。

所以在我切换之前,我必须确保游戏窗口首先被聚焦。

[DllImport("user32.dll")]
static extern bool SetForegroundWindow(IntPtr hWnd);
...
if(shouldToggleFullscreen) {
   SetForegroundWindow(Window.Handle);
   if (IsActive) {
      graphics.ToggleFullScreen();
      shouldToggleFullscreen = false;
   }
}