获取监视器的名称

Nmd*_*ery 5 c++ winapi

我在用winapi检索监视器名称时遇到了一些麻烦。根据stackoverflow上的其他条目,获取监视器名称的正确方法是:

EnumDisplayDevices(nullptr, 0, &oDisplayDevice, 0);

char lpszDeviceName[32];
memcpy(lpszDeviceName, oDisplayDevice.DeviceName, 32);

EnumDisplayDevices(lpszDeviceName, 0, &oDisplayDevice, 0);

char lpszMonitorName[128];
memcpy(lpszMonitorName, oDisplayDevice.DeviceString, 128);
Run Code Online (Sandbox Code Playgroud)

但是,第二次EnumDisplayDevices返回FALSE。第一次,DeviceName\\DISPLAY1DeviceString是GPU厂商。使用MONITORINFOEXstruct给我的价值与相同DeviceName

为了清楚起见,我正在寻找类似“ Samsung blah blah”之类的东西,或者屏幕分辨率页面上控制面板中显示的内容。

Ret*_*nja 6

这似乎为我返回了正确的数据:

#include <Windows.h>
#include <iostream>
#include <string>

int main()
{
    DISPLAY_DEVICE dd;
    dd.cb = sizeof(dd);
    int deviceIndex = 0;
    while(EnumDisplayDevices(0, deviceIndex, &dd, 0))
    {
        std::string deviceName = dd.DeviceName;
        int monitorIndex = 0;
        while(EnumDisplayDevices(deviceName.c_str(), monitorIndex, &dd, 0))
        {
            std::cout << dd.DeviceName << ", " << dd.DeviceString << "\n";
            ++monitorIndex;
        }
        ++deviceIndex;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果您要为 UNICODE 编译,请改用以下代码:

#include <Windows.h>
#include <iostream>
#include <string>

int main()
{
    DISPLAY_DEVICE dd;
    dd.cb = sizeof(dd);
    int deviceIndex = 0;
    while(EnumDisplayDevices(0, deviceIndex, &dd, 0))
    {
        std::wstring deviceName = dd.DeviceName;
        int monitorIndex = 0;
        while(EnumDisplayDevices(deviceName.c_str(), monitorIndex, &dd, 0))
        {
            std::wcout << dd.DeviceName << L", " << dd.DeviceString << L"\n";
            ++monitorIndex;
        }
        ++deviceIndex;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

下面是一个输出示例:

\.\DISPLAY1\Monitor0, Dell U2410(DP)
\.\DISPLAY2\Monitor0, Dell 2407WFP-HC (Digital)

  • 很难说。我目前可用的 3 台显示器都有特定的驱动程序,但我以前见过使用的通用驱动程序。我会假设,除非他们开始围绕设备名称和字符串的组合切换电缆,否则将是唯一标识符。 (2认同)