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

问题描述 投票:1回答:1

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

c++ winapi multiple-monitors
1个回答
1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.