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