EnumDisplayDevices vs WMI Win32_DesktopMonitor, zu erkennen, wie aktive Monitore?
Für mein Aktuelles C++ Projekt, das ich brauchen, um festzustellen, eine eindeutige Zeichenfolge für jeden monitor, der angeschlossen ist und aktiv auf eine große Anzahl von Computern.
Forschung hat darauf hingewiesen 2 Optionen
-
Verwendung der WMI-Abfrage und die Win32_DesktopMonitor für alle aktiven Monitore. Verwenden Sie die PNPDeviceID für eine eindeutige Identifizierung der Monitore.
-
Nutzung der EnumDisplayDevices-API, und Graben Sie nach unten, um die Geräte-ID.
Ich bin daran interessiert, mit der Geräte-id für die eindeutige Modell-Identifikation, weil Monitoren mit Standard-plug-and-play-Treiber meldet, dass der generische string-als monitor-name "default plug-and-play-monitor"
Ich habe Probleme mit dem WMI-Methode, scheint es doch nur du 1 monitor auf meinem Vista-Rechner, der Blick auf die doco es stellt sich heraus, es funktioniert nicht wie erwartet auf nicht WDDM-Geräte.
Die EnumDisplayDevices scheint ein wenig problematisch zu bekommen, wenn es läuft als hintergrund-service (vor allem auf Vista), Wenn es in Sitzung 0 wird es wieder keine info.
-
Hat jemand anderes hatte, etwas ähnliches zu tun (finden Sie einzigartige Modell-string für alle angeschlossenen aktiven Monitore?)
-
Welchem Ansatz gearbeitet am besten?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist meine aktuelle work-in-progress-code für die Erkennung des monitor device-id, zuverlässig.
identifier DeviceID is undefined
ich habe versucht, die Suche auf msdn für eine angemessene gehören jedoch konnte ich nicht finden keine separaten Geräte-id-parameter. Können Sie mir bitte sagen, was die header-Datei habe ich auch für die Geräte-id identifiziert werden.Ich habe gerade entdeckt, können Sie die Abfrage Win32_PnPEntity für service="monitor", und es werden wieder alle Monitore.
Ergebnisse auf meinem Rechner:
Wir haben liebäugelt mit EnumDisplayDevices, um zu erkennen, ob die aktuelle Grafikkarte Hersteller NVIDIA. Es ist nicht das gleiche, aber vielleicht würde es helfen. Unser Stück sah dann so aus:
Ziemlich dumm ist, aber funktioniert.
Ich habe nie versucht, es zu tun aus einem Dienst, aber
EnumDisplayDevices
im Allgemeinen gut funktioniert, wenn Sie als Benutzer ausführen. Ich glaube, dass die Dienste laufen in einem separaten (und kopflos) - session, die erklären könnten, das problem, Sie sehen es.Könnte Sie ausführen, ein Helfer-Programm von Ihrem service, die Identität eines Benutzer-Kontos ein, das Zugriff auf die displays?
Den Win32_DesktopMonitor Methode gibt nur 1 monitor auf meinem Vista-Rechner auch. Die PnP-ID scheint korrekt eingestellt zu sein, obwohl.
Ich hatte ein schnelles Spiel mit der EnumDisplayDevices-API, und während es scheint, zu entdecken, die adapter details zuverlässig (vermutlich, weil die meisten Leute nicht lassen Sie es als "Standard-VGA" für long), es gibt nur "Plug und Play-Monitor" für die angeschlossenen Monitore.
Diese Echos Forschung, die ich haben in diesem vor ein paar Jahren mussten einige Codes zusammen, um Hilfe im abstauben diese Erinnerungen aus).
Dies ist von einem normalen Benutzer-account. Wenn Sie haben einen zuverlässigen Weg, um EnumDisplayDevices die Rückkehr der PnP-ID, die auch in der normalen Benutzer-sessions, wäre ich daran interessiert-wir sind derzeit daran, wenn diese Informationen zur Verfügung, um einen Gerätetreiber.
Eine Sache, die Sie tun können, wenn der code ausgeführt wird aus session #0 ist nicht zuverlässig genug ist, um zu sehen, wenn Sie laichen können einen Helfer-Prozess (entweder mit CreateProcessAsUser oder der Verwendung von COM mit der Aktivierung moniker), die ausgeführt werden im Kontext des Benutzers.