为什么IDXGISwapChain :: SetFullscreenState无法全屏显示?

时间:2012-03-07 01:06:45

标签: c++ windows-7 directx-11

我在游戏中使用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远程调试程序启动时。

2 个答案:

答案 0 :(得分:1)

似乎调试器或其他应用程序正在窃取焦点,或看门狗计时器正在吸引你。

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

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

答案 1 :(得分:0)

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

相关问题