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

Windows 如何在DXGI中获取监视器/输出的当前显示模式(分辨率、刷新率)?,windows,fullscreen,direct3d,dxgi,Windows,Fullscreen,Direct3d,Dxgi,我正在创建一个多监视器全屏DXGI/D3D应用程序。我正在列举可用的输出和适配器,准备创建它们的交换链 使用DXGI的方法创建交换链时,我需要提供交换链说明,其中包括类型的缓冲区说明,详细说明宽度、高度、刷新率等。如何确定当前设置的输出(或如何确定当前输出的显示模式)?使用此交换链进入全屏时,我不想更改用户的分辨率或刷新率。我在这里看到了解决方案: 以下部分: // Now go through all the display modes and find the one that ma

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

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

我在这里看到了解决方案:

以下部分:

   // Now go through all the display modes and find the one that matches the screen width and height.
    // When a match is found store the numerator and denominator of the refresh rate for that monitor.
    for(i=0; i<numModes; i++)
    {
        if(displayModeList[i].Width == (unsigned int)screenWidth)
        {
            if(displayModeList[i].Height == (unsigned int)screenHeight)
            {
                numerator = displayModeList[i].RefreshRate.Numerator;
                denominator = displayModeList[i].RefreshRate.Denominator;
            }
        }
    }
//现在检查所有显示模式,找到与屏幕宽度和高度匹配的模式。
//找到匹配项后,存储该监视器刷新率的分子和分母。

对于(i=0;i在仔细查看之后,我偶然发现了
EnumDisplaySettings
legacy 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获得准确的当前显示模式,而不是使用此方法?

这可能就是您要寻找的:
This might be what you are looking for:


            // Get display mode list
            std::vector<DXGI_MODE_DESC*> modeList = GetDisplayModeList(*outputItor);
            for(std::vector<DXGI_MODE_DESC*>::iterator modeItor = modeList.begin(); modeItor != modeList.end(); ++modeItor)
            {
            //  PrintDisplayModeInfo(*modeItor);
            }
        }




std::vector<DXGI_MODE_DESC*> GetDisplayModeList(IDXGIOutput* output)
{
    UINT num = 0;
    DXGI_FORMAT format = DXGI_FORMAT_R32G32B32A32_TYPELESS;
    UINT flags = DXGI_ENUM_MODES_INTERLACED | DXGI_ENUM_MODES_SCALING;

    // Get number of display modes
    output->GetDisplayModeList(format, flags, &num, 0);

    // Get display mode list
    DXGI_MODE_DESC * pDescs = new DXGI_MODE_DESC[num];
    output->GetDisplayModeList(format, flags, &num, pDescs);

    std::vector<DXGI_MODE_DESC*> displayList;
    for(int i = 0; i < num; ++i)
    {
        displayList.push_back(&pDescs[i]);
    }

    return displayList;
}
//获取显示模式列表 std::vector modeList=GetDisplayModeList(*输出程序); 对于(std::vector::iterator modeItor=modeList.begin();modeItor!=modeList.end();++modeItor) { //PrintDisplayModeInfo(*modeItor); } } std::vector GetDisplayModeList(IDXGIOutput*输出) { UINT num=0; DXGI_FORMAT FORMAT=DXGI_FORMAT_R32G32B32A32_无类型; UINT flags=DXGI_ENUM_MODES_interlated|DXGI_ENUM_MODES_SCALING; //获取显示模式的数量 输出->GetDisplayModeList(格式、标志和数值,0); //获取显示模式列表 DXGI_MODE_DESC*pDescs=新的DXGI_MODE_DESC[num]; 输出->GetDisplayModeList(格式、标志和数值、pDescs); 向量显示列表; 对于(int i=0;i
对不起,我不是在寻找当前的显示模式,也不是一个可用的显示模式列表。但是,通过查看您提供的链接的源代码,我找到了一组不同的Windows函数,这些函数可以帮助我进入当前的显示模式……非常感谢!顺便说一句,现代的方法是
DwmGetCompositionTimingInfo
API,如何在没有Aero的Win7上,如果禁用了DWM_E_合成,则会失败