【问题标题】:Is there a way to get the native resolution in c++ & winapi?有没有办法在 c++ 和 winapi 中获得本机分辨率?
【发布时间】:2019-05-10 15:37:20
【问题描述】:

有没有办法在 c++ 和 winapi 中获得推荐的分辨率?

我通过使用GetMonitorInfoEnumDisplaySettingsEnumDisplayMonitorsGetSystemMetrics 仅获得当前分辨率。

编辑: 经过一番研究,我发现了这个示例代码Example code for displaying an app on a portrait device

即使不是关于本机分辨率,它也会显示如何获取它。为此,请查看函数 HRESULT GetPathInfo(_In_ PCWSTR pszDeviceName, _Out_ DISPLAYCONFIG_PATH_INFO* pPathInfo)bool IsNativeOrientationPortrait(const LUID AdapterLuid, const UINT32 TargetId)

到目前为止,该代码可以工作,但我不知道它在 Windows 8.1 和以前版本下的表现如何。没有做任何进一步的测试。

【问题讨论】:

  • 推荐的分辨率是显示器的原始分辨率。 stackoverflow.com/a/10073368/17034
  • 如果有人故意将他们的显示器设置为非本机分辨率,这不是他们想要使用的分辨率吗?为什么像素羞辱他们? ;-)
  • @dave 这不是关于羞辱。这是关于找到显示器的原始分辨率。
  • @DavidHeffernan 该问题询问的是“首选”和“推荐”分辨率,而不是原始分辨率。也许这是一个翻译错误,Zen1000 的意思是说“本地”,但如果是这样,最好编辑问题标题和文本以使其更清楚。

标签: c++ winapi


【解决方案1】:

实际上,您可以执行 GetSupportedFullScreenResolutions 来获取显示器支持的分辨率列表,通常最后一个索引是显示器的最佳(最高)分辨率。

像这样:

#include <Windows.h>
#include <iostream>
using namespace std;

int main()
{
    DEVMODE dm = { 0 };
    dm.dmSize = sizeof(dm);
    for (int iModeNum = 0; EnumDisplaySettings(NULL, iModeNum, &dm) != 0; iModeNum++) 
    {
        cout << "Mode #" << iModeNum << " = " << dm.dmPelsWidth << "x" << dm.dmPelsHeight << endl;
    }

    return 0;
}

编辑:

可以获取显卡的分辨率,将得到的最大分辨率与屏幕分辨率进行比较。一般来说,两者中最小的就是最好的分辨率。

#include <Windows.h>
#include <iostream>
using namespace std;

int main()
{
    UINT32 PathArraySize = 0;
    UINT32 ModeArraySize = 0;
    DISPLAYCONFIG_PATH_INFO* PathArray;
    DISPLAYCONFIG_MODE_INFO* ModeArray;
    DISPLAYCONFIG_TOPOLOGY_ID CurrentTopology;
    //Directly query the resolution of the graphics card and get the physical resolution all the time.
    GetDisplayConfigBufferSizes(QDC_ALL_PATHS, &PathArraySize, &ModeArraySize);
    PathArray = (DISPLAYCONFIG_PATH_INFO*)malloc(PathArraySize * sizeof(DISPLAYCONFIG_PATH_INFO));
    memset(PathArray, 0, PathArraySize * sizeof(DISPLAYCONFIG_PATH_INFO));
    ModeArray = (DISPLAYCONFIG_MODE_INFO*)malloc(ModeArraySize * sizeof(DISPLAYCONFIG_MODE_INFO));
    memset(ModeArray, 0, ModeArraySize * sizeof(DISPLAYCONFIG_MODE_INFO));
    LONG ret = QueryDisplayConfig(QDC_DATABASE_CURRENT, &PathArraySize, PathArray, &ModeArraySize, ModeArray, &CurrentTopology);

    int x_DisplayConfigScreen = ModeArray->targetMode.targetVideoSignalInfo.activeSize.cx;
    int y_DisplayConfigScreen = ModeArray->targetMode.targetVideoSignalInfo.activeSize.cy;

    return 0;
}

【讨论】:

  • 如果显示器支持比本机更高的分辨率,则不起作用。
  • @Zen1000 然后可以得到显卡支持的最大分辨率,和屏幕分辨率对比。通常两者中最小的就是最好的分辨率。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-10
  • 2014-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多