2008-10-15 3 views
17

Weiß jemand, ob es eine API gibt, um den aktuellen Monitorstatus (ein oder aus) in Windows (XP/Vista/2000/2003) zu bekommen?Gibt es eine Möglichkeit, den Überwachungsstatus in Windows (on oder off) zu erkennen?

Alle meine Suchen scheinen anzuzeigen, dass es keine echte Möglichkeit gibt, dies zu tun.

This thread versucht, GetDevicePowerState zu verwenden, die laut Microsoft-Dokumentation für Anzeigegeräte nicht funktioniert.

In Vista kann ich GUID_MONITOR_POWER_ON hören, aber ich scheint keine Ereignisse zu erhalten, wenn der Monitor manuell ausgeschaltet wird.

In XP kann ich in WM_SYSCOMMANDSC_MONITORPOWER einhaken, auf der Suche nach Status 2. Dies funktioniert nur in Situationen, in denen das System das Ausschalten auslöst.

Die WMI Win32_DesktopMonitor Klasse scheint nicht so gut zu helfen.

bearbeiten: Hier a discussion auf comp.os.ms-windows.programmer.win32 anzeigt, dass es keine zuverlässige Möglichkeit, dies zu tun.

Hat noch jemand andere Ideen?

+0

Verwandte Frage: http://stackoverflow.com/questions/328490/monitoring-a-displays-state-in-python – CesarB

+1

Was Sie mit diesen Informationen versuchen zu erreichen? Vielleicht könnten wir helfen, das eigentliche Problem zu lösen. Grüße. – Mick

+1

Um ungefähr die Leistung von Monitoren zu schätzen, die physisch mit einem Computer verbunden sind –

Antwort

11

GetDevicePowerStatemanchmal funktioniert für Monitore. Wenn es vorhanden ist, können Sie das Gerät \\. \ LCD öffnen. Schließen Sie es sofort, nachdem Sie damit fertig sind.

Im Grunde haben Sie kein Glück - es gibt keine zuverlässige Möglichkeit, den Status des Monitors zu erkennen, ohne einen Gerätetreiber zu schreiben und alle Strom-IRPs in der Display-Treiberkette auf und ab zu filtern. Und das ist auch nicht sehr zuverlässig.

+1

Ich denke, das ist die nächste Antwort auf die Frage. Es ist ein echter Fehler der Hardware-Mfgs, dass sie uns im DVI-Standard nicht diese Ebene der Kommunikation geben. –

+0

Ernsthaft, schließen Sie es sofort, nachdem Sie damit fertig sind. Ich brach einmal den Präsentationsmodus auf Michael Dells Laptop, indem ich das nicht machte :) –

7

Bevor Sie irgendetwas auf der Grundlage des Monitorzustands tun, denken Sie daran, dass Benutzer eine Maschine mit Remote-Desktop anderer Systeme verwenden können, die keinen an die Maschine angeschlossenen Monitor benötigen - schalten Sie daher keine Visualisierung auf Basis der Zustand überwachen.

+1

Die Windows-API erlaubt es Ihnen herauszufinden, ob ein Monitor "echt" ist oder nicht. Siehe: DISPLAY_DEVICE_MIRRORING_DRIVER. –

+0

Remotedesktop-Apps wirken sich immer noch auf den Bildschirmschoner aus, nicht wahr? (Zumindest RealVNC tut das.) Ich weiß, dass die Windows-eigenen Remotedesktopsitzungen ein anderes System verwenden, daher können sich die Dinge dort unterscheiden. – Macke

6

Sie können nicht.

Blick wie alle Monitorleistungsfähigkeiten zum verbunden „Stromsparmodus“
Nach der Suche i here Code gefunden, dass die Verwendung zwischen SC_MONITORPOWER Nachricht und Systemwerten (post-Nummer 2)
I Verbindungs Der Code zum Testen, ob sich die Systemwerte ändern, wenn ich den Monitor manuell ausschalte.

int main() 
{ 
    for(;monitorOff()!=1;) 
     Sleep(500); 
    return 0; 
}//main 

Und der Code wird nie gestoppt, egal wie lange ich meinen Monitor ausschalte.
Dort wird der Code von monitorOff Funktion:

int monitorOff() 
{ 
    const GUID MonitorClassGuid = 
     {0x4d36e96e, 0xe325, 0x11ce, 
      {0xbf, 0xc1, 0x08, 0x00, 0x2b, 0xe1, 0x03, 0x18}}; 

    list<DevData> monitors; 
    ListDeviceClassData(&MonitorClassGuid, monitors); 

    list<DevData>::iterator it = monitors.begin(), 
          it_end = monitors.end(); 
    for (; it != it_end; ++it) 
    { 
     const char *off_msg = ""; 

     //it->PowerData.PD_PowerStateMapping 
     if (it->PowerData.PD_MostRecentPowerState != PowerDeviceD0) 
     { 
      return 1; 
     } 
    }//for 

    return 0; 
}//monitorOff 

Fazit: wenn Sie manuell die des Monitors wechseln, Sie es durch Fenster fangen kann nicht (wenn es keine ungewöhnliche Treiber-Schnittstelle hierfür ist), weil Alle Windows-Funktionen sind mit "Power Safe Mode" verbunden.

12

Sie könnten eine Webcam anschließen, richten Sie sie auf dem Bildschirm und einige Analyse der Bilder, die Sie empfangen;)

+3

Aber dann können Sie Reflexionen für Bildschirmaktion fälschen.Ich denke, dass Sie ein Gerätetreiberproblem in ein Bildverarbeitungsproblem verwandeln. Ich mag es :) – cpatrick

+2

Diese Technik wurde verwendet, um Racks voller Ausrüstung an entfernten Standorten zu überwachen. Richten Sie eine Kamera auf das Rack und achten Sie auf "ungewöhnliche" Änderungen der Anzeigeleuchten. Seine rohe Gewalt, aber in einigen Fällen ist es die einzig vernünftige Antwort. – RBerteig

0

Wenn Ihr Monitor eine Art eingebauter USB-Hub hat, kann man versuchen, und das erkennen, verwendet werden, wenn der Monitor aus an.
Dies funktioniert natürlich nur, wenn der USB-Hub nicht angeschlossen bleibt, wenn der Monitor als "aus" betrachtet wird.

0

Mit Delphi-Code können Sie ungültigen Monitor geomerty erfassen, während im Standby läuft:

i := 0 
('Monitor'+IntToStr(i)+': '+IntToStr(Screen.Monitors[i].BoundsRect.Left)+', '+ 
IntToStr(Screen.Monitors[i].BoundsRect.Top)+', '+ 
IntToStr(Screen.Monitors[i].BoundsRect.Right)+', '+ 
IntToStr(Screen.Monitors[i].BoundsRect.Bottom)) 

Ergebnisse:

Monitor-Geometrie vor Standby:

Monitor0: 0, 0, 1600, 900 

Monitor-Geometrie während Standby in Deplhi7 :

Monitor0: 1637792, 4210405, 31266576, 1637696 

Monitor-Geometrie während Standby in DeplhiXE:

Monitor0: 4211194, 40, 1637668, 1637693 
0

Dies ist eine wirklich alte Post, aber wenn es jemand helfen kann, ich habe eine Lösung zu erkennen, einen Bildschirm zur Verfügung steht oder nicht gefunden: das Anschließen und Konfigurieren des Displays (CCD) API von Windows.

Es ist ein Teil von User32.ddl und die interessanten Funktionen sind GetDisplayConfigBufferSizes und QueryDisplayConfig. Es gibt uns alle Informationen, die im Konfigurationsfenster von Windows angezeigt werden können.

Insbesondere die PathInfo enthält eine TargetInfo Eigenschaft, die eine targetAvailable Flagge haben. Dieses Flag scheint bei allen Konfigurationen korrekt zu sein, die ich bisher ausprobiert habe.

Damit können Sie den Status aller an den PC angeschlossenen Bildschirme kennen und deren Konfigurationen festlegen.

Here a CCD wrapper for .Net

+0

Dies funktionierte bei mir nicht mit einem einzelnen Dell Monitor, der über DisplayPort mit Windows 10 PC verbunden war. targetAvailable war immer 1, unabhängig vom Status des Monitors. Danke, dass du deine Ergebnisse geteilt hast. – Greg

Verwandte Themen