- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我找到了 7 种不同的方法来枚举连接到计算机的监视器。但是所有解决方案都会给出不同的结果(监视器的数量和每个监视器上的信息)。
这些解决方案是:
使用著名的EnumDisplayDevices
使用 Windows Management Instrumentation (WMI) :
使用以下查询:root\\WMI
命名空间中的 SELECT * FROM WmiMonitorID
。
再次使用 WMI :
使用新查询:root\\CIMV2
命名空间中的 SELECT * FROM Win32_DesktopMonitor
。
使用 Setup API :
首先调用 SetupDiGetClassDevs
然后检索设备信息集,迭代 SetupDiEnumDeviceInfo
使用 DirectX Graphics Infrastructure (DXGI)
第一个 IDXGIFactory::EnumAdapters
,然后 IDXGIAdapter::EnumOutput
使用 Connecting and Configuring Displays (CCD) APIs :
QueryDisplayConfig
(QDC_ALL_PATHS, &numPathArrayElements, pathInfoArray, &numModeInfoArrayElements, modeInfoArray, nullptr);
我试图通过 MSDN 引用准确理解所有这些方法之间的区别,但徒劳无功。
据我观察:
使用这些方法(已连接显示器列表、已安装显示器列表、事件显示器列表)时,我真正期望的结果是什么?如果我使用镜像显示器或扩展显示器怎么办?如果电脑有多个显卡却没有多个输出怎么办?
Bonus:一些方法(DXGI、EnumDisplayDevices、CCD)使用一种带有Adapter的层次结构- 监视器。但没有给出适配器和监视器之间的相同链接。那么,DXGI 的适配器的定义是什么? CCD?对于 EnumDisplayDevices?
最佳答案
我不知道所有这些 API,但我确实记得其中一些(糟糕的内存),所以这是我在 MSDN 中四处寻找和玩 wbemtest 时能记住和发现的,我很惊讶我什至记得。我知道这个答案可能不是您所希望的ALL。
对于下面的插图(所有这些插图都在我的戴尔 Latitude 笔记本电脑上,我在上面给你打字,逻辑上我有两台显示器通过扩展坞连接到它)。但是,笔记本电脑已关闭,因此笔记本电脑屏幕不可见。
如果我进入显示属性,我只能看到一个屏幕。
连接到 CIMv2
select * from Win32_DesktopMonitor;
返回两个实例。
DesktopMonitor1 是外接显示器 (GenericPNPDisplay),DesktopMonitor1 是默认显示器(屏幕)。
连接到 root\WMI
select * from WMIMonitorID;
只给我一个实例,那个实例是外接显示器(我知道这是因为制造商名称是 HP)。 (HWP26CE 是 HP w2408 的标识符,见 here)
然后,显示适配器和显示器之间存在差异。 EnumDisplayDevices
显示适配器,EnumDisplayMonitors
显示监视器。前者主要是仅枚举适配器,但后者允许您提供一个剪切矩形并确定该剪切矩形恰好落在哪些监视器上。当您有多个事件监视器并且有人决定做一些导致跨越多个监视器的平局时,这将变得很有用。您可以指定对 EnumDisplayMonitors
的回调,并且将使用一些参数调用该回调(如果内存正确,其中一个参数是位于指定监视器上的指定剪切矩形的子集)。
我依稀记得 SetupDiEnumDeviceInfo
,我认为它为您提供了每个接口(interface)的 HDEVINFO
,因此(我相信)它只会在我的配置中为您提供一个条目,因为我只有一个适配器。然后你必须做一些事情来获取 SP_DEVINFO_DATA
。
我从未使用过 DirectX 和其他 API,因此我将闭嘴谈论这两个。希望其他人能说出这两个问题,您可能会得到一个完整的答案!
关于c++ - 枚举计算机上的监视器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18022612/
我是一名优秀的程序员,十分优秀!