2009-03-02 10 views
7

DUPLICATE:How can I programmatically determine if my workstation is locked?Überprüfung auf Arbeitsplatz Sperren/Entsperren Änderung mit C#

Wie kann ich (während der Laufzeit) erkennen, wenn ein Windows-Benutzer ihren Bildschirm (Windows + L) gesperrt sind und es wieder entriegelt. Ich weiß, dass ich die Tastatureingabe global verfolgen kann, aber ist es möglich, das mit Umgebungsvariablen zu überprüfen?

+0

Die Antworten auf diese Frage könnten einen Ausgangspunkt für Sie bieten. http://stackoverflow.com/questions/44980 –

+0

Danke an alle. Sie waren wie immer sehr hilfsbereit :) –

Antwort

3

Sie können diese Benachrichtigung über eine WM_WTSSESSION_CHANGE Meldung. Sie müssen Windows mitteilen, dass Sie diese Nachrichten über WTSRegisterSessionNotification erhalten möchten, und die Registrierung mit WTSUnRegisterSessionNotification aufheben.

Diese Beiträge sollten für eine C# -Implementierung hilfreich sein.

http://pinvoke.net/default.aspx/wtsapi32.WTSRegisterSessionNotification

http://blogs.msdn.com/shawnfa/archive/2005/05/17/418891.aspx

http://bytes.com/groups/net-c/276963-trapping-when-workstation-locked

+0

Beat mich um ein paar Sekunden :) – shahkalpesh

+0

-1: Die Version des verwalteten Codes wurde vor der Win32-Version veröffentlicht ... Warum ist dies sogar als die richtige Antwort markiert? – Powerlord

+0

Kaum ein Grund für einen Downvote tho, wie? –

-2

Sie absolut nicht WM_WTSSESSION_CHANGE brauchen nur internen WTTS Apis verwenden.

2

Sie können ComponentDispatcher als eine alternative Möglichkeit verwenden, diese Ereignisse zu erhalten.

Hier ist eine Beispielklasse, um das zu wickeln.

public class Win32Session 
{ 
    private const int NOTIFY_FOR_THIS_SESSION = 0; 
    private const int WM_WTSSESSION_CHANGE = 0x2b1; 
    private const int WTS_SESSION_LOCK = 0x7; 
    private const int WTS_SESSION_UNLOCK = 0x8; 

    public event EventHandler MachineLocked; 
    public event EventHandler MachineUnlocked; 

    public Win32Session() 
    { 
     ComponentDispatcher.ThreadFilterMessage += ComponentDispatcher_ThreadFilterMessage; 
    } 

    void ComponentDispatcher_ThreadFilterMessage(ref MSG msg, ref bool handled) 
    { 
     if (msg.message == WM_WTSSESSION_CHANGE) 
     { 
      int value = msg.wParam.ToInt32(); 
      if (value == WTS_SESSION_LOCK) 
      { 
       OnMachineLocked(EventArgs.Empty); 
      } 
      else if (value == WTS_SESSION_UNLOCK) 
      { 
       OnMachineUnlocked(EventArgs.Empty); 
      } 
     } 
    } 

    protected virtual void OnMachineLocked(EventArgs e) 
    { 
     EventHandler temp = MachineLocked; 
     if (temp != null) 
     { 
      temp(this, e); 
     } 
    } 

    protected virtual void OnMachineUnlocked(EventArgs e) 
    { 
     EventHandler temp = MachineUnlocked; 
     if (temp != null) 
     { 
      temp(this, e); 
     } 
    } 
} 
Verwandte Themen