Windows 如何获取显示器的 friendly name

EnumDisplayDevices() 获取到的 DeviceName 是 \\\\.\\DISPLAY1,DeviceString是显卡名称;

GetMonitorInfo() 取到的 MONITORINFOEX 也是 \\\\.\\DISPLAY1;

EnumDisplaySettings() 的 dmDeviceName 是 “CDD”;

DisplayConfigGetDeviceInfo() 和 QueryDisplayConfig() 这两个 API 没有,很奇怪,我的win10版本和user32.dll版本都是比较新的。

我想得到的是像Windows显示设置里的显示器名称,比如我的是“DELL XXXX”,除了以上的还有其他办法吗?

如果你希望获取比较新的显示器信息,你可以考虑使用 Microsoft Windows Management Instrumentation (WMI) 来获取显示器的信息。

你可以使用 WMI 的 Win32_DesktopMonitor 类来获取显示器的信息,其中的 MonitorManufacturer 属性代表显示器的制造商名称,MonitorType 属性代表显示器的类型,Caption 属性代表显示器的名称。

如果你想要使用 WMI,你可以使用 WMI 的查询语言(WQL)来查询 Win32_DesktopMonitor 类的信息,例如:

SELECT * FROM Win32_DesktopMonitor


你也可以使用 WMI 的 C++ 接口来访问 Win32_DesktopMonitor 类的信息。下面是一个使用 WMI C++ 接口来获取显示器信息的例子:

#include <iostream>
#include <comdef.h>
#include <Wbemidl.h>

#pragma comment(lib, "wbemuuid.lib")

int main()
{
    HRESULT hres;

    // 初始化 COM
    hres = CoInitializeEx(0, COINIT_MULTITHREADED);
    if (FAILED(hres))
    {
        std::cout << "Failed to initialize COM library. Error code = 0x"
            << std::hex << hres << std::endl;
        return 1;
    }

    // 设置验证 COM 的安全级别
    hres = CoInitializeSecurity(
        NULL,
        -1,
        NULL,
        NULL,
        RPC_C_AUTHN_LEVEL_DEFAULT,
        RPC_C_IMP_LEVEL_IMPERSONATE,
        NULL,
        EOAC_NONE,
        NULL
        );

    if (FAILED(hres))
    {
        std::cout << "Failed to initialize security. Error code = 0x"
            << std::hex << hres << std::endl;
        CoUninitialize();
        return 1;
    }

    // 获取本地计算机名
    char szName[MAX_COMPUTERNAME_LENGTH + 1];
    DWORD dwSize = MAX_COMPUTERNAME_LENGTH + 1;
    GetComputerName(szName, &dwSize);

    // 初始化本地