【问题标题】:Why does EnumDisplayDevices ignore my second gpu?为什么 EnumDisplayDevices 会忽略我的第二个 gpu?
【发布时间】:2014-07-25 20:34:35
【问题描述】:

我接到这样的电话:

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

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

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

【问题讨论】:

  • 您是否尝试过来自 Windows 8.x SDK 或旧版 DirectX SDK 的 DxCapsViewer? EnumDisplayDevices 是一个老式 API,因此使用 DXGI(Windows Vista 或更高版本)或 Direct3D 9(Windows XP)可能会更好。
  • 我希望不是这样。但听到它是一个刚刚被允许过时的旧 API,我并不感到惊讶。

标签: windows directx


【解决方案1】:

这是因为 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++;
    }

【讨论】:

    猜你喜欢
    • 2016-04-07
    • 2017-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多