GOOGLE ADS

Mittwoch, 20. April 2022

Rufen Sie den aktuellen Zustand des Laptopdeckels ab

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

Ich habe pInvoke bereits zusammen mit der RegisterPowerSettingNotification-Funktion von Microsoft mit Hilfe dieser SO-Antwort verwendet.

Mit dem oben Gesagten weiß ich also, wann der Deckel geschlossen oder geöffnet wird, und kenne seinen Zustand, ABER ich möchte den Zustand des Deckels abrufen, bevor irgendetwas anderes fortgesetzt wird. Mir ist aufgefallen, dass die Callback-Funktion aufgerufen wird, selbst wenn sich der Deckel nicht ändert, und ich kann ihren Parameter überprüfen, um den Zustand des Deckels zu erfahren, aber das ist nicht gut für mich, da es sich um ein Ereignis handelt und ich nicht einfach warten kann damit es auftritt (vielleicht gibt es eine andere Möglichkeit, dies zu umgehen?).

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

BEARBEITEN 1: Ich kann die App nicht warten oder verzögern, und es gibt zwei Probleme, bei denen ich den Status ohne CB abrufen muss. Das erste ist, dass ein Deckel geschlossen werden kann, während der Laptop an einen Monitor angeschlossen ist, wodurch der Benutzer zugelassen wird den Laptop zu benutzen. Wenn der Benutzer die App in dieser Situation startet, sollte sie nicht gestartet werden. Der zweite Grund ist, dass ich möchte, dass die App benutzerfreundlich ist und benachrichtigt, was passiert, wenn sie startet oder stoppt, und wenn ich das cb zur falschen Zeit bekomme, wird es aufgrund der inneren Logik der App möglicherweise ignoriert und muss es dann warten bis ich das nächste mal einen cb bekomme, würde ich überhaupt.

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

EDIT 2: Aus Kommentaren scheint nicht klar zu sein, was ich brauche. Ich brauche eine Möglichkeit, den Zustand des Deckels abzufragen. dh - eine API oder so etwas aufrufen und der Rückgabewert ist der Zustand. Danke!

Schlüsselwörter: GUID_LIDSWITCH_STATE_CHANGE, WM_POWERBROADCAST, Energieeinstellung


Lösung des Problems

Ich glaube nicht, dass sich der „Deckelzustand" garantiert in den Energieverwaltungseigenschaften widerspiegelt. Liegt Ihr Interesse am Deckelzustand einfach am Monitor? Wenn ja, könnten Sie einen Weg finden, die Eigenschaften des integrierten Bildschirms zu bestimmen (könnte ein Problem sein, wenn er installiert wird, während er an einen externen Monitor angeschlossen ist) und sie speichern. Überprüfen Sie dann die Eigenschaften des verwendeten Bildschirms/der verwendeten Bildschirme und handeln Sie entsprechend.

Siehe System.Windows.Forms.Screen – http://msdn.microsoft.com/en-us/library/system.windows.forms.screen%28v=vs.110%29.aspx

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

http://sourceforge.net/p/wmimonitor/code/HEAD/tree/DisplayInfoWMIProvider/WMIProvider/WMIProvider.cs

Unter der Annahme, dass die Rückrufe auch dann noch ausgelöst werden, wenn das Ereignis zum Schließen des Deckels in Windows auf „Nichts tun" eingestellt ist, könnten Sie alternativ vielleicht einen Hilfsprozess oder -dienst in Betracht ziehen, der ständig ausgeführt wird und Änderungen nachverfolgt. Sie können den Status über die Registrierung oder eine Datei freigeben. Sie können auch prüfen, ob andere Hardwareelemente (z. B. Touchpad) den Energiestatus beim Schließen unabhängig vom „Energiesparplan" ändern, und die GetDevicePowerState-API-Funktion verwenden.

Keine Kommentare:

Kommentar veröffentlichen

Warum werden SCHED_FIFO-Threads derselben physischen CPU zugewiesen, obwohl CPUs im Leerlauf verfügbar sind?

Lösung des Problems Wenn ich das richtig verstehe, versuchen Sie, SCHED_FIFO mit aktiviertem Hyperthreading ("HT") zu verwenden, ...