IDXGIFactory::MakeWindowAssociation 方法 (dxgi.h)

允许 DXGI 监视应用程序的消息队列中的 alt-enter 键序列 (这会导致应用程序从窗口切换到全屏,反之亦然) 。

语法

HRESULT MakeWindowAssociation(
  HWND WindowHandle,
  UINT Flags
);

参数

WindowHandle

类型: HWND

要监视的窗口的句柄。 此参数可以为 NULL;但前提是 Flags 也为 0。

Flags

类型: UINT

以下一个或多个值。

  • DXGI_MWA_NO_WINDOW_CHANGES - 阻止 DXGI 监视应用程序消息队列;这会使 DXGI 无法响应模式更改。
  • DXGI_MWA_NO_ALT_ENTER - 阻止 DXGI 响应 alt-enter 序列。
  • DXGI_MWA_NO_PRINT_SCREEN - 阻止 DXGI 响应打印屏幕键。

返回值

类型: HRESULT

DXGI_ERROR_INVALID_CALLWindowHandle 是否无效或E_OUTOFMEMORY。

备注

注意 如果在会话 0 进程中调用此 API,它将返回 DXGI_ERROR_NOT_CURRENTLY_AVAILABLE
 
WindowHandleFlags 的组合通知 DXGI 停止监视以前关联的窗口的窗口消息。

如果应用程序切换到全屏模式,DXGI 将选择全屏分辨率作为支持的最小分辨率,该分辨率更大或大小与当前后台缓冲区大小相同。

应用程序可以进行一些更改,使从窗口到全屏的转换更高效。 例如,在WM_SIZE消息上,应用程序应释放任何未完成的交换链后退缓冲区,调用 IDXGISwapChain::ResizeBuffers,然后从交换链 () 重新获取后台缓冲区。 这使交换链 () 有机会重设后台缓冲区的大小,并/或重新创建它们以启用全屏翻转操作。 如果应用程序不执行此序列,DXGI 仍将进行全屏/窗口转换,但可能会被迫使用拉伸操作 (,因为后台缓冲区可能不是正确的大小) ,这可能会降低效率。 即使不需要拉伸,呈现也可能不是最佳的,因为后部缓冲区可能无法与前缓冲区直接互换。 因此,始终建议调用 WM_SIZE 上的 ResizeBuffers ,因为WM_SIZE始终在全屏转换期间发送。

在窗口化时,应用程序可以选择将其窗口工作区的大小限制为可舒适呈现的大小。 完全灵活的应用程序不会做出此类限制,但 UI 元素或其他设计注意事项当然会使这种灵活性变得站不住脚。 如果应用程序进一步选择将其窗口的工作区限制为仅与支持的全屏分辨率匹配的工作区,则应用程序可以字段WM_SIZING,然后针对 IDXGIOutput::FindClosestMatchingMode 检查。 如果找到匹配的模式,则允许调整大小。 (可以从 IDXGISwapChain::GetContainingOutput 检索 IDXGIOutput。如果没有对桌面拓扑的后续更改,这将与在字段 alt-enter 时选择的输出相同,并且为该交换链启动全屏模式。)

想要处理模式更改或 Alt+Enter 的应用程序应在创建交换链后使用DXGI_MWA_NO_WINDOW_CHANGES标志调用 MakeWindowAssociationWindowHandle 参数(如果非 NULL)指定特定目标 HWND 的所有交换链的 DXGI 运行时不会处理应用程序消息队列。 在创建交换链后使用 DXGI_MWA_NO_WINDOW_CHANGES 标志调用 MakeWindowAssociation 可确保 DXGI 不会干扰应用程序对窗口模式更改或 Alt+Enter 的处理。

必须在与目标 HWND 交换链关联的工厂对象上调用 MakeWindowAssociation 方法, () 。 可以通过调用交换链上的 IDXGIObject::GetParent 方法来保证 () 查找工厂。 下面是执行此操作的代码示例。

void MakeWindowAssociationWithLocatedFactory(
    winrt::com_ptr<IDXGISwapChain> const& swapChain,
    HWND hWnd,
    UINT flags)
{
    winrt::com_ptr<IDXGIFactory1> factory;
    factory.capture(swapChain, &IDXGISwapChain::GetParent);
    factory->MakeWindowAssociation(hWnd, flags);
}

Windows 应用商店应用说明

如果 Windows 应用商店应用调用 MakeWindowAssociation,则失败并 DXGI_ERROR_NOT_CURRENTLY_AVAILABLE

Microsoft Win32 应用程序可以使用 MakeWindowAssociation 通过 Alt+Enter 组合键和全屏打印屏幕行为来控制全屏过渡。 对于 Windows 应用商店应用,由于 DXGI 无法执行全屏切换,因此 Windows 应用商店应用无法控制全屏切换。

要求

   
目标平台 Windows
标头 dxgi.h
Library DXGI.lib

另请参阅

DXGI 接口

IDXGIFactory