这将是非常棘手的......应该如何处理的正确方法是IDXGIFactory::MakeWindowAssociation
,据我所知,没有人能够成功使用。无论如何,您可能都想尝试一下。
“正确”的答案是手动处理 Alt+Enter。所以,禁用 Alt+EnterMakeWindowAssociation
并弄脏你的手。首先,不需要捕获WM_SIZE
. 相反,请听WM_ENTERSIZEMOVE
、WM_CAPTURECHANGED
和。这将使您不必处理并仍然获得所有相关的窗口大小调整事件。(执行此操作时,请同时阅读此问题:WM_ENTERSIZEMOVE / WM_EXITSIZEMOVE - 使用菜单时,并不总是配对)WM_WINDOWPOSCHANGED
WM_EXITSIZEMOVE
WM_SIZE
好的,假设一切顺利,对于 Alt+Enter,您必须执行以下操作:使用将交换链设置为全屏IDXGISwapChain::SetFullscreenState
,然后调整交换链 ( IDXGISwapChain::ResizeBuffers
) 的大小。默认情况下,在调整大小之前,您将获得一个尽可能接近当前窗口分辨率的交换链。您正确执行此操作的方法是首先枚举全屏分辨率,然后在全屏时强制使用您想要的分辨率。这听起来很难看,但它似乎是解决问题的最可靠的方法。
一般来说,真正的独占全屏模式不值得麻烦,因为当有人按 Alt+Tab 时你总是会闪烁(如果发生模式切换,你无法避免它,因为屏幕本身必须重新调整。)更好的解决方案是使用全屏无边框窗口。您只需创建一个没有任何装饰的窗口类,使其全屏显示,将其放置为覆盖整个屏幕并完成它。那么你就完全不用担心 Alt+Enter 和 Alt+Tab 了。它还允许人们继续在第二个屏幕上工作而不会闪烁。性能方面,这还不错(大多数新游戏都支持“无边框全屏”。)
可能有一个灵丹妙药可以正确解决所有这些问题,但我还没有看到它。如果有更清洁/更好的解决方案,我真的很想听到它。“无边框全屏”似乎是当前标准,但 IIRC、Unity 5 仅允许 Direct3D 11 的“无边框全屏”。