J'ai trouvé 7 façons différentes d'énumérer les moniteurs connectés à l'ordinateur. Mais toutes les solutions donnent des résultats différents (nombre de moniteurs et informations sur chaque moniteur).
Ces solutions sont :
-
En utilisant le célèbre
EnumDisplayDevices
-
Utilisation de
EnumDisplayMonitors
-
Utilisation de la Instrumentation de gestion Windows (WMI) :
Avec la requête suivante :SELECT * FROM WmiMonitorID
dans leroot\\WMI
espace de noms. -
En utilisant à nouveau le WMI :
Avec la nouvelle requête :SELECT * FROM Win32_DesktopMonitor
dans leroot\\CIMV2
espace de noms. -
Utilisation de la API de configuration :
En appelant d'abordSetupDiGetClassDevs
pour récupérer l'ensemble des informations sur le dispositif, puis, en itérant avecSetupDiEnumDeviceInfo
-
Utilisation de la Infrastructure graphique DirectX (DXGI)
Avec le premierIDXGIFactory::EnumAdapters
alorsIDXGIAdapter::EnumOutput
-
Utilisation de la API de connexion et de configuration des écrans (CCD) :
QueryDisplayConfig
(QDC_ALL_PATHS, &numPathArrayElements, pathInfoArray, &numModeInfoArrayElements, modeInfoArray, nullptr);
J'ai essayé de comprendre précisément la différence entre toutes ces méthodes avec la référence MSDN, en vain.
Observations
D'après ce que j'ai observé :
- El WmiMonitorID y API de configuration Les requêtes renvoient la liste des écrans connectés (pas nécessairement actifs).
- La requête *Win32_DesktopMonitor WMI* retourne mauvais Résultat (au moins inattendu) (seulement 1 moniteur énuméré même si inactif et bureau sur un autre moniteur).
- EnumDisplayDevices renvoie la liste des dispositifs actifs (sauf lorsqu'un seul moniteur est actif avec un autre moniteur connecté)
- EnumDisplayMonitors y DXGI Les requêtes retournent la liste des moniteurs actifs.
- CCD semble être la méthode la plus fiable (donne tous les chemins possibles entre les cibles et les sources).
Questions
Quel résultat dois-je réellement attendre en utilisant chacune de ces méthodes (liste des écrans connectés, liste des écrans installés, liste des écrans actifs) ? Que se passe-t-il si j'utilise des écrans miroirs ou des écrans étendus ? Que se passe-t-il si l'ordinateur possède plusieurs cartes graphiques sans sorties multiples ?
Bonus : Certaines méthodes ( DXGI , EnumDisplayDevices , CCD ) utilisent une sorte de hiérarchie avec Adaptateur -*Moniteur*. Mais cela ne donne pas les mêmes liens entre les adaptateurs et les moniteurs. Alors, quelle est la définition d'un adaptateur pour DXGI ? pour CCD ? pour EnumDisplayDevices ?