特定视频/图形适配器上的EnumDisplayMonitors?

时间:2015-02-06 12:49:49

标签: c++ winapi multiple-monitors

我想要枚举附加到特定视频适配器的所有显示器。我成功检索了视频适配器信息并从中创建了HDC,但当我在EnumDisplayMonitors上调用HDC时,没有任何反应。如果我将EnumDisplayMonitors称为HDC,NULL将正常工作。

win32_root.cpp

for (int i = 0;; ++i) {
    DISPLAY_DEVICE dd = { 0 };
    dd.cb = sizeof(DISPLAY_DEVICE);

    if (!EnumDisplayDevices(NULL, i, &dd, 0)) {
        break;
    }

    if (dd.StateFlags & DISPLAY_DEVICE_ACTIVE) {
        adapters.push_back(new Mage::Adapter(dd));
    }
}

win32_display.cpp

Mage::Adapter::Adapter(DISPLAY_DEVICE dd)
: device(dd)
{
    this->context = CreateDC(L"DISPLAY", device.DeviceName, NULL, NULL);
    EnumDisplayMonitors(this->context, NULL, MonitorEnumProc, (LPARAM)&(this->displays));

这导致我的回调函数根本没被调用。将this->context更改为NULL将枚举附加到我的计算机的所有显示。此外,这确实枚举了适配器上的显示,但我特别需要显示器的HMONITOR结构:

if (!EnumDisplayDevices(device.DeviceName, i, &dm, 0)) {
    return;
}

如何正确枚举特定DISPLAY_DEVICE上的显示/监视器?

1 个答案:

答案 0 :(得分:1)

EnumDisplayDevices是您想要的呼叫。您可以要求它提供适配器,或连接到特定适配器的显示器等,但是您必须提供正确的信息组合才能获取特定的数据集。

从下面的参考链接中:

要获取有关显示监视器的信息,请首先将lpDevice设置为NULL调用EnumDisplayDevices。然后从第一次调用EnumDisplayDevices并将iDevNum设置为零的lpDevice设置为DISPLAY_DEVICE.DeviceName的情况下调用EnumDisplayDevices。然后,DISPLAY_DEVICE.DeviceString是监视器名称。

要查询与适配器关联的所有监视器设备,请在循环中调用EnumDisplayDevices,并将lpDevice设置为适配器名称,将iDevNum设置为0,将iDevNum设置为递增,直到函数失败。请注意,每次调用显示器信息时,DISPLAY_DEVICE.DeviceName都会更改,因此您必须保存适配器名称。没有适配器的监视器时,该功能将失败。

ref:https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-enumdisplaydevicesa