【问题标题】:Getting the monitor's name with EnumDisplayDevices使用 EnumDisplayDevices 获取显示器的名称
【发布时间】:2012-04-24 14:05:20
【问题描述】:

我遇到了this 帖子,其中有人想使用 EnumDisplayDevices 找出他们的显示器的名称。

这正是我想要的,我尝试在 C++ 中做类似的事情,但对 EnumDisplayDevices 的第二次调用似乎从未返回任何内容,我只获取有关显卡的信息。

DISPLAY_DEVICE dd;
memset(&dd, 0, sizeof(DISPLAY_DEVICE));
dd.cb = sizeof(dd);
int i = 0;
while(EnumDisplayDevices(NULL, i, &dd, 0))
{
    Log(_T("Device Name: %s Device String: %s"), dd.DeviceName, dd.DeviceString);

    if(EnumDisplayDevices(dd.DeviceName, 0, &dd, 0))
    {
        Log(_T("Monitor Name: %s Monitor String: %s"), dd.DeviceName, dd.DeviceString);
    }

    i++;
} 

我得到的输出是

Device Name: \\.\DISPLAY1 Device String: NVIDIA GeForce 9300 GE
Device Name: \\.\DISPLAYV1 Device String: NetMeeting driver
Device Name: \\.\DISPLAYV2 Device String: RDPDD Chained DD

目标平台是 XP,我无法通过任何标准方法找到监视器名称。有什么想法吗?

谢谢。

【问题讨论】:

标签: c++ windows


【解决方案1】:

第一次调用 EnumDisplayDevices DispDev.DeviceString 包含显卡名称。 在第二次调用之后,DispDev.DeviceString 包含监视器的名称

另请参阅link 了解获取此信息的其他方式

BOOL GetMonitorInfo(int nDeviceIndex, LPSTR lpszMonitorInfo) {
    BOOL bResult = TRUE;
    FARPROC EnumDisplayDevices;
    HINSTANCE  hInstUserLib;
    DISPLAY_DEVICE DispDev;
    char szDeviceName[32];

    hInstUserLib = LoadLibrary("User32.DLL");

    EnumDisplayDevices = (FARPROC)GetProcAddress(hInstUserLib,
                                                 "EnumDisplayDevicesA");
    if(!EnumDisplayDevices) {
        FreeLibrary(hInstUserLib);
        return FALSE;
    }

    ZeroMemory(&DispDev, sizeof(DISPLAY_DEVICE));
    DispDev.cb = sizeof(DISPLAY_DEVICE);

    // After first call to EnumDisplayDevices DispDev.DeviceString 
    //contains graphic card name
    if(EnumDisplayDevices(NULL, nDeviceIndex, &DispDev, 0)) {
        lstrcpy(szDeviceName, DispDev.DeviceName);

        // after second call DispDev.DeviceString contains monitor's name 
        EnumDisplayDevices(szDeviceName, 0, &DispDev, 0);

        lstrcpy(lpszMonitorInfo, DispDev.DeviceString);
    }
    else {
        bResult = FALSE;
    }

    FreeLibrary(hInstUserLib);

    return bResult;
}

【讨论】:

  • 嗨 Flot,是否只能获得“即插即用监视器”之类的名称,因为这就是我现在得到的。我想要显示器的实际名称,例如我的是 DELL P190S。
  • 您确定驱动程序是原装戴尔驱动程序而不是普通的即插即用 Windows 驱动程序吗?因为我通过这种方式获得了我的显示器的真实名称。
  • 在设备管理器中它也只是显示为即插即用监视器,所以我猜不是。我以为监视器名称来自监视器的 EDID,不是这样吗?它只是从驱动程序中获取的?
  • EDID 不公开公共 API。您可以直接从注册表中读取:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\DISPLAY\<Type>\<SWnumber>\Device Parameters 或使用 WMI 并查询 Win32_DesktopMonitor。
  • 另请参阅我在答案中添加的链接
【解决方案2】:

我认为Win32_DesktopMonitor 可能更适合您正在尝试做的事情。

【讨论】:

  • 很遗憾,XP 不支持此功能,因此我无法使用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-06
  • 2020-03-02
  • 2014-05-19
  • 2017-02-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多