gpt4 book ai didi

c++ - 枚举计算机上的监视器

转载 作者:IT老高 更新时间:2023-10-28 14:01:27 26 4
gpt4 key购买 nike

我找到了 7 种不同的方法来枚举连接到计算机的监视器。但是所有解决方案都会给出不同的结果(监视器的数量和每个监视器上的信息)。

这些解决方案是:

  1. 使用著名的EnumDisplayDevices

  2. 使用 EnumDisplayMonitors

  3. 使用 Windows Management Instrumentation (WMI) :
    使用以下查询:root\\WMI 命名空间中的 SELECT * FROM WmiMonitorID

  4. 再次使用 WMI :
    使用新查询:root\\CIMV2 命名空间中的 SELECT * FROM Win32_DesktopMonitor

  5. 使用 Setup API :
    首先调用 SetupDiGetClassDevs然后检索设备信息集,迭代 SetupDiEnumDeviceInfo

  6. 使用 DirectX Graphics Infrastructure (DXGI)
    第一个 IDXGIFactory::EnumAdapters ,然后 IDXGIAdapter::EnumOutput

  7. 使用 Connecting and Configuring Displays (CCD) APIs :
    QueryDisplayConfig (QDC_ALL_PATHS, &numPathArrayElements, pathInfoArray, &numModeInfoArrayElements, modeInfoArray, nullptr);

我试图通过 MSDN 引用准确理解所有这些方法之间的区别,但徒劳无功。

观察

据我观察:

  • WmiMonitorIDSetup API 查询返回已连接(不一定是事件)显示器的列表。
  • Win32_DesktopMonitor WMI 查询返回错误(至少是意外)结果(即使在非事件状态下也仅枚举了 1 个监视器并且桌面位于另一监视器上)。
  • EnumDisplayDevices 返回事件设备列表(除非只有 1 台显示器处于事件状态并连接了其他显示器)
  • EnumDisplayMonitorsDXGI 查询返回事件监视器列表。
  • CCD 似乎是最可靠的方法(提供目标和源之间的所有可能路径)。

问题

使用这些方法(已连接显示器列表、已安装显示器列表、事件显示器列表)时,我真正期望的结果是什么?如果我使用镜像显示器或扩展显示器怎么办?如果电脑有多个显卡却没有多个输出怎么办?

Bonus:一些方法(DXGIEnumDisplayDevicesCCD)使用一种带有Adapter的层次结构- 监视器。但没有给出适配器和监视器之间的相同链接。那么,DXGI 的适配器的定义是什么? CCD?对于 EnumDisplayDevices

最佳答案

我不知道所有这些 API,但我确实记得其中一些(糟糕的内存),所以这是我在 MSDN 中四处寻找和玩 wbemtest 时能记住和发现的,我很惊讶我什至记得。我知道这个答案可能不是您所希望的ALL

对于下面的插图(所有这些插图都在我的戴尔 Latitude 笔记本电脑上,我在上面给你打字,逻辑上我有两台显示器通过扩展坞连接到它)。但是,笔记本电脑已关闭,因此笔记本电脑屏幕不可见。

如果我进入显示属性,我只能看到一个屏幕。

enter image description here

连接到 CIMv2

select * from Win32_DesktopMonitor;

返回两个实例。

enter image description here

DesktopMonitor1 是外接显示器 (GenericPNPDisplay),DesktopMonitor1 是默认显示器(屏幕)。

连接到 root\WMI

select * from WMIMonitorID;

只给我一个实例,那个实例是外接显示器(我知道这是因为制造商名称是 HP)。 (HWP26CE 是 HP w2408 的标识符,见 here)

enter image description here

然后,显示适配器和显示器之间存在差异。 EnumDisplayDevices 显示适配器,EnumDisplayMonitors 显示监视器。前者主要是仅枚举适配器,但后者允许您提供一个剪切矩形并确定该剪切矩形恰好落在哪些监视器上。当您有多个事件监视器并且有人决定做一些导致跨越多个监视器的平局时,这将变得很有用。您可以指定对 EnumDisplayMonitors 的回调,并且将使用一些参数调用该回调(如果内存正确,其中一个参数是位于指定监视器上的指定剪切矩形的子集)。

我依稀记得 SetupDiEnumDeviceInfo,我认为它为您提供了每个接口(interface)的 HDEVINFO,因此(我相信)它只会在我的配置中为您提供一个条目,因为我只有一个适配器。然后你必须做一些事情来获取 SP_DEVINFO_DATA

我从未使用过 DirectX 和其他 API,因此我将闭嘴谈论这两个。希望其他人能说出这两个问题,您可能会得到一个完整的答案!

关于c++ - 枚举计算机上的监视器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18022612/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com