LockState von Windows abfragen ohne SystemEvents

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    LockState von Windows abfragen ohne SystemEvents

    Hallöchen,
    ich möchte ein Programm zum Überwachen des LockStates von nem PC schreiben.
    (Also im Prinzip ein simpler Log, ala 12:31 - Entsperrt, 16:30 - Gesperrt).


    Die folgenden Dinge habe ich untersucht/versucht:
    SystemEvents - Leider feuern die Events aus irgendeinem Grund nicht (Getested habe ich nen Sample-Code von SO, unter einer WinForm und in einer Console).
    EventLog - Das Auditing ist leider deaktiviert und auf Security kann sowieso nicht zugegriffen werden.
    Manuelles Prüfen (also Polling) - Ist jetzt eher unschön, wird aber wahrscheinlich meine Lösung werden.


    Gibt es vlt. noch einen anderen Weg zum Prüfen ob der PC gesperrt ist (vlt. WMI)?



    Wie mach ich das Polling "korrekt"/besser. Mein jetziger Versuch sieht im Prinzip so aus (Pseudocode):

    Quellcode

    1. while(true){
    2. StatusChecken()
    3. Loggen()
    4. Schlafen() //Für 5 Sekunden
    5. }
    "Zwei Dinge sind unendlich, das Universum und die menschliche Dummheit, aber bei dem Universum bin ich mir noch nicht ganz sicher." Albert Einstein
    wie sieht dein Code aus für SystemEvents mit WinForms? Konsole sollte denk ich nicht funktionieren, da du denke ich die MessageLoop brauchst und das event sich in die einklinkt...
    hast du das fenster hidden oder ist es visible? mal probiert unter deinem usernamen direkt auszuführen(also Run as...[dein username])?
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Das ist jetzt aus dem Gedächtnis geschrieben, da ich den Test-Code nicht mehr habe:

    C#-Quellcode

    1. class MainForm : Form{
    2. public MainForm(){
    3. SystemEvents.SessionSwitch += SessionSwitchHandler;
    4. }
    5. ~MainForm(){
    6. SystemEvents.SessionSwitch -= SessionSwitchHandler;
    7. }
    8. void SessionSwitchHandler(object sender, SessionSwitchEventArgs e){
    9. switch(e.Reason){
    10. case SessionSwitchReason.SessionLock:
    11. MessageBox.Show("Locked");
    12. break;
    13. case SessionSwitchReason.SessionUnlock:
    14. MessageBox.Show("Unlocked");
    15. break;
    16. }
    17. }
    18. }

    Die Form war die unveränderte "Standard"-Form (außer dem Namen), also war auf Visible.
    Inwiefern direkt ausführen?
    "Zwei Dinge sind unendlich, das Universum und die menschliche Dummheit, aber bei dem Universum bin ich mir noch nicht ganz sicher." Albert Einstein
    naja könnte ja unter dem Anwender "System" laufen und der meldet sich glaube ich nie ab, du allerdings schon...
    Was ist aus der InitializeComponent geworden? die brauchst du meines Wissens, sonst funktioniert das nicht
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Hi,
    der Code oben war wie gesagt aus dem Gedächtnis.
    Ich habe damals ne Standard Form genommen (das was VS generiert) und den oberen Code so eingefügt/hinzugefügt.
    InitializeComponents wurde normal aufgerufen.

    Das ganze wird als User ausgeführt.

    RodFromGermany schrieb:

    Kommt da evtl was in der WndProc() vorbei?


    Du meinst via protected override void WndProc(ref Message m)?
    Ich kuck nachher mal.

    --EDIT--

    Das Thema hat sich geklärt. Jetzt werden die Events komischerweise ausgelöst.
    Wahrscheinlich dann mein Fehler.

    Ich habe das ganze auf der Host/Arbeits-Maschine selber erzeugt (via SharpDevelop) und da ist nichts passiert.
    Jetzt habe ich es auf meinem privaten via Visual Studio probiert und es geht.

    Naja. Entschuldigung für die verschwendete Zeit.
    "Zwei Dinge sind unendlich, das Universum und die menschliche Dummheit, aber bei dem Universum bin ich mir noch nicht ganz sicher." Albert Einstein

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „hellmaster159“ ()

    hellmaster159 schrieb:

    Du meinst via protected override void WndProc(ref Message m)?
    Genau die.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!