1

我在游戏中使用 DX11,我希望能够可靠地全屏启动游戏。这意味着我可以选择以下两种方式之一:在交换链描述中指定全屏,或者启动窗口并立即切换到全屏。根据 MSDN(http://msdn.microsoft.com/en-us/library/windows/desktop/bb174537(v=vs.85).aspx),您应该在窗口模式下创建交换链,然后切换到全屏如果你想以全屏模式开始,这正是我正在做的。

问题是这样的:当我调用IDXGISwapChain::SetFullscreenState(TRUE, NULL)时,调用失败并返回 DXGI_ERROR_NOT_CURRENTLY_AVAILABLE 错误代码。根据 MSDN,可能发生这种情况的原因如下:

  • 该应用程序正在终端服务器上运行。
  • 输出窗口被遮挡。
  • 输出窗口没有键盘焦点。
  • 另一个应用程序已处于全屏模式。

第一种情况不成立。我的远程调试器用完了 Visual Studio 2010,所以除非远程调试器使用终端服务器,否则我可以使用那个。第二种情况也不成立;桌面上没有其他窗口。第四种情况也不成立;同样,桌面上没有其他窗口。

这留下了第三种选择。键盘焦点。根据我在网上收集的信息,我创建了此代码以在创建 DX11 图形设备之前获得键盘焦点。

HWND _returnValue = SetFocus(m_hWnd);
if(_returnValue == NULL) {
    PrintWarning("Unable to get keyboard focus on app activation.\n");
}

此调用成功,但我仍然没有全屏显示。我也找不到替代方法。但是,我确实知道可以可靠地窃取键盘焦点,因为我看到 Windows 一直在这样做,而且我已经看到其他应用程序这样做了。

所以我的问题是:我怎样才能可靠地全屏显示?或者我怎样才能可靠地为我的应用程序获得键盘焦点?

编辑:在阅读了几次之后,我意识到我错过了一些关键信息。如果我通过双击直接使用 .exe 或将其放入目标计算机的启动菜单中,应用程序始终以全屏模式正确启动(尽管 Windows 防火墙消息仍然使其无法全屏显示,但我没有需要它来工作)。唯一的问题是当应用程序由另一个应用程序启动时,或者如果它是使用 Visual Studio 远程调试器启动的。

4

2 回答 2

1

调试器或其他应用程序似乎正在窃取焦点,或者看门狗定时器正在获取您。

请参阅 MSDN 中 DXGI 概述中的“全屏模式调试”:http: //msdn.microsoft.com/en-us/library/windows/desktop/bb205075 (v=vs.85).aspx#Debugging

特别是那里提到了一个您可能需要设置的注册表项。

于 2012-04-13T04:36:28.840 回答
0

对我来说,将屏幕显示更改为“复制”而不是“扩展”解决了这个问题。我不确定根本原因是什么,因为我有一个全屏......呃......“可视化应用程序”在扩展显示模式下打开,同时在控制台应用程序上的 Visual Studio 中工作时没有问题,直到我运行陷入这种境地。因此,请尝试将您的显示从“扩展”更改为“复制”。

于 2017-02-14T22:00:34.727 回答