为什么EnumDisplayDevices会忽略我的第二个gpu?

时间:2014-07-25 20:34:35

标签: windows directx

我接到了这样的电话:

while(EnumDisplayDevices(NULL, index, &displayDevice, 0)) {
  // do stuff
}

我的理解是,这应该将所有图形设备报告为displayDevice,但它只报告一次,多次。我有一块英特尔卡作为我的主适配器而NVidia卡作为辅助卡 - 我希望不仅能够获取两张卡的名称和信息,还能确定应用程序运行的位置with(即应用程序默认为Intel,但我可以更改NVidia控制面板中的默认设置,甚至可以使用Windows资源管理器中的上下文菜单)。但是,呼叫始终报告三个设备......并且所有三个设备都是英特尔。它将英特尔报告为\。\ DISPLAY1,\。\ DISPLAY2和\。\ DISPLAY3。

通过查看它使用的DLL,我可以确认我的代码使用正确的图形卡运行。 (事实上​​,我需要连接第二台显示器才能让它完全使用NVidia卡 - 否则,无论我选择哪种卡,该应用程序都会在英特尔上启动。无论哪种方式,英特尔卡总是以DISPLAY_DEVICE_ACTIVE的形式返回。

1 个答案:

答案 0 :(得分:0)

这是因为DISPLAY_DEVICE结构中的标志,DISPLAY_DEVICE_PRIMARY_DEVICE - 主桌面在设备上。对于具有单个显卡的系统,始终设置此选项。对于具有多个显示卡的系统,只有一个设备可以具有此设置。 要从第二个GPU获取活动显示设备,请使用以下标志条件

    while (EnumDisplayDevices(NULL, index, &dd, 0))
    {
        if(((dd.StateFlags & DISPLAY_DEVICE_ACTIVE) && ((dd.StateFlags & DISPLAY_DEVICE_ACTIVE) || (!(dd.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE))) &&(!(dd.StateFlags & DISPLAY_DEVICE_MIRRORING_DRIVER))))
        {
            activeDispCount++;
        }
        index++;
    }