Aktuellen Status des Laptop-Deckels abrufen

8

Ich schreibe eine C # -App (speziell für Laptops) und möchte den Zustand des Deckels kennen, d. h. wann ist er offen und wann ist er geschlossen.

Ich habe pInvoke bereits zusammen mit Microsofts RegisterPowerSettingNotification verwendet Funktion mit Hilfe von diese SO-Antwort .

>

Also, mit dem Obengenannten weiß ich, wenn der Deckel geschlossen oder geöffnet wird und seinen Zustand kennt, ABER ich möchte den Zustand des Deckels erreichen, bevor alles andere weitergeht. Ich habe bemerkt, dass, selbst wenn es keine Änderung am Deckel gibt, die Callback-Funktion aufgerufen wird und ich den Parameter überprüfen kann, um den Zustand des Deckels zu erfahren, aber das ist nicht gut für mich, da es ein Ereignis ist und ich nicht einfach warten kann damit es passiert (vielleicht gibt es eine andere Möglichkeit, um dies zu umgehen?).

Ich habe auch die PowerEnumerate-Funktion ausprobiert, konnte aber nichts davon bekommen (vielleicht gibt es etwas, von dem ich nicht weiß, dass es helfen könnte)

EDIT 1: Ich kann nicht warten oder die App verzögern, und es gibt 2 Probleme, die mich benötigen, um den Zustand ohne eine CB zu erhalten, die erste ist, dass ein Deckel geschlossen werden kann, während der Laptop an einen Monitor angeschlossen ist, so dass der Benutzer die verwenden kann Laptop. Wenn der Benutzer die App in dieser Situation startet, sollte er nicht starten. Der zweite Grund ist, dass ich möchte, dass die App benutzerfreundlich ist und benachrichtigt, was passiert, wenn sie startet oder aufhört. Wenn ich das cb zur falschen Zeit bekomme, kann es aufgrund der inneren Logik der App ignoriert werden und muss dann warte bis ich das nächste mal ein cb bekomme, würde ich überhaupt.

Also, (kein Wortspiel beabsichtigt) Gibt es eine Möglichkeit, diese Informationen sofort zu erhalten?

EDIT 2: Es scheint von Kommentaren, dass es nicht klar ist, was ich brauche. Ich brauche eine Möglichkeit, den Zustand des Deckels abzufragen. d.h. - eine API oder etwas aufrufen und der Rückgabewert ist der Zustand. Danke!

Schlüsselwörter: GUID_LIDSWITCH_STATE_CHANGE, WM_POWERBROADCAST, Energieeinstellung

    
ZivS 11.11.2014, 16:45
quelle

2 Antworten

0

Nach langer Suche von @ Llwyds Antwort fand ich eine Lösung. Ich habe festgestellt, dass das Gerät beim Schließen des Deckels aus dem Gerätemanager entfernt wird, also muss geprüft werden, ob es da ist oder nicht. Der Code dahinter ist ein bisschen groß, um hier hochzuladen, also werde ich nicht, aber das Folgende war nötig: 1) Identifizieren des internen Bildschirm-Namens \ ID mit WmiMonitorConnectionParams und VideoOutputTechnology und Status ( DISPLAY_DEVICE_ATTACHED und / oder DISPLAY_DEVICE_ACTIVE ) 2) Sobald ich den Namen / die ID des Geräts kenne, kann ich es leicht durch Aufzählung von System.Windows.Forms.Screen.AllScreens (oder speichere den Wert von DISPLAY_DEVICE_ATTACHED) nachsehen

    
ZivS 11.12.2014, 16:17
quelle
2

Ich glaube nicht, dass sich der "Deckelzustand" in den Energieverwaltungseigenschaften widerspiegelt. Ist dein Interesse am Deckel einfach auf den Monitor gerichtet? Wenn dies der Fall ist, könnten Sie eine Möglichkeit finden, die Eigenschaften des integrierten Bildschirms zu bestimmen (könnte ein Problem sein, wenn sie installiert werden, während sie mit einem externen Monitor verbunden sind) und sie speichern. Überprüfen Sie dann die Eigenschaften der verwendeten Bildschirme und handeln Sie entsprechend.

Siehe System.Windows.Forms.Screen - Ссылка

Seriennummern können aus den Schlüssel 'Geräteparameter' in HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\DISPLAY extrahiert werden. Wie man es extrahiert (zusammen mit anderen Informationen) wird hier gezeigt:

Ссылка

Wenn Sie davon ausgehen, dass die Callbacks auch dann noch ausgelöst werden, wenn das Schließen des Deckels in Windows auf "Do Nothing" eingestellt ist, könnten Sie möglicherweise einen Hilfsprozess oder -dienst in Betracht ziehen, um die Änderungen zu verfolgen. Sie können den Status über die Registrierung oder eine Datei freigeben. Sie können auch prüfen, ob andere Hardwareteile (z. B. Touchpad) den Schließzustand beim Schließen unabhängig vom Energiesparplan ändern und die API-Funktion GetDevicePowerState verwenden.

    
Llwyd 02.12.2014 11:35
quelle

Tags und Links