gpt4 book ai didi

windows - 如何在 DXGI 中获取监视器/输出的当前显示模式(分辨率、刷新率)?

转载 作者:可可西里 更新时间:2023-11-01 12:35:44 26 4
gpt4 key购买 nike

我正在创建一个多显示器全屏 DXGI/D3D 应用程序。我正在枚举可用的输出和适配器,以准备创建它们的交换链。

使用 DXGI 的 IDXGIFactory::CreateSwapChain 创建我的交换链时方法,我需要提供交换链描述,其中包括 DXGI_MODE_DESC 类型的缓冲区描述详细说明了宽度、高度、刷新率等。如何找出当前设置的输出(或如何找出当前输出的显示模式)?当我使用此交换链进入全屏时,我不想更改用户的分辨率或刷新率。

最佳答案

在进一步查看之后,我偶然发现了 EnumDisplaySettings 遗留 GDI 函数,它允许我访问当前的分辨率和刷新率。将其与 IDXGIOutput::FindClosestMatchingMode 函数结合使用,我可以非常接近当前显示模式:

void getClosestDisplayModeToCurrent(IDXGIOutput* output, DXGI_MODE_DESC* outCurrentDisplayMode)
{
DXGI_OUTPUT_DESC outputDesc;
output->GetDesc(&outputDesc);
HMONITOR hMonitor = outputDesc.Monitor;
MONITORINFOEX monitorInfo;
monitorInfo.cbSize = sizeof(MONITORINFOEX);
GetMonitorInfo(hMonitor, &monitorInfo);
DEVMODE devMode;
devMode.dmSize = sizeof(DEVMODE);
devMode.dmDriverExtra = 0;
EnumDisplaySettings(monitorInfo.szDevice, ENUM_CURRENT_SETTINGS, &devMode);

DXGI_MODE_DESC current;
current.Width = devMode.dmPelsWidth;
current.Height = devMode.dmPelsHeight;
bool useDefaultRefreshRate = 1 == devMode.dmDisplayFrequency || 0 == devMode.dmDisplayFrequency;
current.RefreshRate.Numerator = useDefaultRefreshRate ? 0 : devMode.dmDisplayFrequency;
current.RefreshRate.Denominator = useDefaultRefreshRate ? 0 : 1;
current.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
current.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
current.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;

output->FindClosestMatchingMode(&current, outCurrentDisplayMode, NULL);
}

...但我认为这不是真正正确的答案,因为我需要使用遗留功能。有什么方法可以使用 DXGI 来获取准确的当前显示模式而不是使用这种方法吗?

关于windows - 如何在 DXGI 中获取监视器/输出的当前显示模式(分辨率、刷新率)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15583294/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com