我想要枚举附加到特定视频适配器的所有显示器。我成功地检索了视频适配器信息并从中创建了HDC
,但是当我在EnumDisplayMonitors
上调用HDC
时,没有任何反应。如果我用EnumDisplayMonitors
称为HDC,NULL
将正常工作。
和Anakrh.spb
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
上的显示器/显示器?
EnumDisplayDevices是您想要的电话。您可以询问它的适配器,或连接到特定适配器的监视器等 - 但您必须提供正确的信息组合才能获取特定的数据集。
从下面的参考链接:
要在显示监视器上获取信息,首先调用EnumDisplayDevices,并将lpDevice设置为NULL。然后调用EnumDisplayDevices,将lpDevice设置为DISPLAY_DEVICE.DeviceName,从第一次调用EnumDisplayDevices并将iDevNum设置为零。然后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