【问题标题】:Properly Handling Alt-Enter / Alt-Tab Fullscreen Resolution正确处理 Alt-Enter / Alt-Tab 全屏分辨率
【发布时间】:2014-10-11 17:11:26
【问题描述】:

The MSDN page on DXGI 提供有关如何处理不同于桌面分辨率的全屏分辨率的说明。它说在调用IDXGISwapChain::SetFullscreenState() 之前调用IDXGISwapChain::ResizeTargets() 以防止闪烁等。

它没有说明如何处理 Alt-Enter,它会在程序有机会自己调用 IDXGISwapChain::ResizeTargets() 之前调用 IDXGISwapChain::SetFullscreenState()。如果在WM_SIZE 消息上调用后一种方法,则会发送另一个WM_SIZE 消息,可能导致无限循环。如何确保在按下 alt-enter 或 alt-tab 时,后者会在前者之前被调用,并且模式切换通常会轻松进行?

【问题讨论】:

    标签: c++ windows directx direct3d dxgi


    【解决方案1】:

    这将非常棘手......应该如何处理的正确方法是IDXGIFactory::MakeWindowAssociation,据我所知,没有人能够成功使用它。无论如何,您可能想尝试一下。

    “正确”的答案是手动处理 Alt+Enter。因此,使用 MakeWindowAssociation 禁用 Alt+Enter 并弄脏你的手。首先,不需要捕获WM_SIZE。相反,请收听 WM_ENTERSIZEMOVEWM_CAPTURECHANGEDWM_WINDOWPOSCHANGEDWM_EXITSIZEMOVE。这将使您不必处理 WM_SIZE 并仍然获得所有相关的窗口大小调整事件。 (这样做时,请同时阅读此问题:WM_ENTERSIZEMOVE / WM_EXITSIZEMOVE - when using menu, not always paired

    好的,假设一切正常,对于 Alt+Enter,您必须执行以下操作:使用 IDXGISwapChain::SetFullscreenState 将交换链设置为全屏,然后调整交换链的大小 (IDXGISwapChain::ResizeBuffers)。默认情况下,在调整大小之前,您将获得一个尽可能接近当前窗口分辨率的交换链。您正确执行此操作的方法是首先枚举全屏分辨率,然后在全屏时强制使用您想要的分辨率。这听起来很难看,但它似乎是解决问题的最可靠的方法。

    一般来说,真正的独占全屏模式不值得麻烦,因为当有人按 Alt+Tab 时你总是会闪烁(如果发生模式切换,你无法避免它,因为屏幕本身必须重新调整.) 一个更好的解决方案是使用全屏无边框窗口。您只需创建一个没有任何装饰的窗口类,使其全屏显示,将其放置为覆盖整个屏幕并完成它。那么你就完全不用担心 Alt+Enter 和 Alt+Tab 了。它还允许人们继续在第二个屏幕上工作而不会闪烁。性能方面,这还不错(大多数新游戏都支持“无边框全屏”。)

    可能有一个灵丹妙药可以正确解决所有这些问题,但我还没有看到。如果有更清洁/更好的解决方案,我真的很想听到它。 “无边框全屏”似乎是当前标准,但 IIRC、Unity 5 仅允许 Direct3D 11 的“无边框全屏”。

    【讨论】:

    • 只是一个更新——我能够用 WM_SIZE 完成我想要的。涉及到一些黑客攻击,但这只是一条线,并没有真正受到伤害。调用 WM_SIZE 时,我会在调整缓冲区之前检查渲染目标视图是否存在。这样,我不会在创建窗口时遇到空指针错误。不过,其他一切都按照你说的做了。
    • 您究竟是如何处理 ALT+Enter 的?您说要在 MakeWindowAssociation 中禁用 ALT+ENTER,但 ALT+ENTER 不会触发您回答中提到的任何消息。
    • 对于键盘输入,使用“正常”的东西,即 WM_*KEYDOWN 或原始输入。它不需要特殊的消息。
    【解决方案2】:

    我只是想在这个问题上添加一个更新——我编写了一个小型窗口库,我相信它可以很好地处理 DXGI——没有调试消息,没有错误消息,并且一切都按预期运行,至少在我的 Windows 环境中.这个问题的完整解决方案过于复杂,无法在一个答案中解释,因为它需要大量精确放置的方法调用(事实证明,DXGI 确实非常严格),但我的代码在github如果有人想看看它。具体来说,this filethis file 是您要查看的对象 - 后者是前者的聚合对象。

    请注意,我已禁用 ALT+ENTER 以支持 F11,但功能完全相同。

    如果你想使用那个库,顺便说一下,我将它作为免费软件发布,并且很快会提供文档。

    【讨论】:

      猜你喜欢
      • 2011-08-15
      • 1970-01-01
      • 2015-08-08
      • 1970-01-01
      • 1970-01-01
      • 2011-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多