枚举计算机上的显示器 [英] Enumerating monitors on a computer

查看:620
本文介绍了枚举计算机上的显示器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我发现了7种不同的方法来枚举连接到计算机的显示器。但是所有解决方案都会提供不同的结果(每个显示器上的显示器数量和信息)。



这些解决方案是:


  1. 使用着名的)





    然后,显示适配器和显示器之间有区别。 EnumDisplayDevices 显示您的适配器, EnumDisplayMonitors 显示您的显示器。前者主要是枚举该适配器,但后者允许你提供一个剪辑矩形,并确定哪些监视剪切矩形恰好降落在。当你有多个活动监视器,并且有人决定做某些会导致跨越多个监视器的绘制时,这变得有用。你可以指定一个回调到 EnumDisplayMonitors 和回调将一些参数调用(如果没记错的话的参数之一是指定的裁剪矩形土地的一个子集在指定的显示器上)。



    我模糊地记得 SetupDiEnumDeviceInfo ,我认为它给你 HDEVINFO 为每个接口,因此,(我相信)给你只有一个条目在我的配置,因为我只有一个适配器。然后你必须做一些事情去得到 SP_DEVINFO_DATA



    我从来没有使用DirectX和其他API,所以我会关闭那两个。希望别人可以管理这两个人,你可以得到一个完整的答案!


    I have found 7 different ways to enumerate the monitors attached to the computer. But all solutions give different results (number of the monitors and information on each monitor).

    These solutions are:

    1. Using the famous EnumDisplayDevices

    2. Using EnumDisplayMonitors

    3. Using the Windows Management Instrumentation (WMI):
      With the following query: SELECT * FROM WmiMonitorID in the root\\WMI namespace.

    4. Again using the WMI:
      With the new query: SELECT * FROM Win32_DesktopMonitor in the root\\CIMV2 namespace.

    5. Using the Setup API:
      By first calling SetupDiGetClassDevs to retrieve the device information set then, iterating with SetupDiEnumDeviceInfo

    6. Using the DirectX Graphics Infrastructure (DXGI)
      With first IDXGIFactory::EnumAdapters, then IDXGIAdapter::EnumOutput

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

    I've tried to understand precisely the difference between all theses methods with the MSDN reference, in vain.

    Observations

    From what I've observed:

    • The WmiMonitorID and Setup API queries return the list of connected (not necessarily active) displays.
    • The *Win32_DesktopMonitor WMI* query returns wrong (at least unexpected) result (only 1 monitor enumerated even when inactive and desktop on another monitor).
    • EnumDisplayDevices returns the list of active devices (except when only 1 monitor is active with other monitor connected)
    • EnumDisplayMonitors and DXGI queries return the list of active monitors.
    • CCD seems to be the most reliable method (gives all possible paths between targets and sources).

    Questions

    What result should I really expect when using each of these methods (list of connected displays, list of installed displays, list of active displays)? What if I use Mirrored displays or Extended displays? What if the computer has multiple graphics cards without multiple outputs?

    Bonus: Some methods (DXGI, EnumDisplayDevices, CCD) use a kind of hierarchy with Adapter-*Monitor*. But doesn't give the same links between Adapters and Monitors. So, what is the définition of an adapter for DXGI? for CCD? for EnumDisplayDevices?

    解决方案

    I don't know all of these API's but I do remember some of them (bad memories) so here's what I can remember and find from poking around in MSDN and playing with wbemtest which I'm surprised I even remember. I recognize that this answer is probably not ALL that you were hoping for.

    For the illustrations below (and all of these illustrations are on my Dell Latitude laptop I'm typing this to you on and I have logically two monitors connected to it through the docking station). But, the laptop is closed and the laptop screen is therefore not visible.

    If I go into display properties, I see only one screen.

    Connected to CIMv2

    select * from Win32_DesktopMonitor;
    

    returns two instances.

    DesktopMonitor1 is the external display (GenericPNPDisplay) and DesktopMonitor1 is the default monitor (screen).

    Connected to root\WMI

    select * from WMIMonitorID;
    

    gives me only one instance and that instance is the external monitor (I know this because the manufacturer name is HP). (HWP26CE is the identifier for HP w2408, see here)

    Then, there is a difference between display adapters and monitors. EnumDisplayDevices shows you adapters and EnumDisplayMonitors shows you the monitors. The former is primarily to just enumerate the adapters but the latter allows you to provide a clipping rectangle and determine which monitors that clipping rectangle happens to land on. This becomes useful when you have multiple active monitors and someone decides to do something that causes a draw that will straddle multiple monitors. You get to specify a callback to EnumDisplayMonitors and that callback will be invoked with some parameters (if memory serves me correctly one of the parameters was a subset of the specified clipping rectangle that lands on the specified monitor).

    I vaguely remember SetupDiEnumDeviceInfo and I think it gives you the HDEVINFO for each interface and therefore it would (I believe) give you only one entry on my configuration because I have only one adapter. Then you'd have to do something to go get the SP_DEVINFO_DATA.

    I have never used DirectX and the other API so I'll shut up about those two. Hopefully someone else can pipe up about those two and you may get a complete answer!

    这篇关于枚举计算机上的显示器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆