我想要枚举附加到特定视频适配器的所有显示器。我成功检索了视频适配器信息并从中创建了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
上的显示/监视器?
答案 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