Frage

DUPLICATE: Wie kann ich programmatisch festzustellen, ob mein Arbeitsplatz ist gesperrt

Wie kann ich (während der Laufzeit) erkennen, wenn ein Windows-Benutzer ihren Bildschirm (Windows + L) gesperrt und entsperrt hat es wieder. Ich weiß, ich könnte Spur Tastatureingabe global, aber ist es möglich, so etwas mit Umgebungsvariablen zu überprüfen?

War es hilfreich?

Lösung

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 deregistrieren mit WTSUnRegisterSessionNotification.

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

Andere Tipps

SessionSwitch Ereignis kann die beste Wahl sein dafür. Schauen Sie sich die SessionSwitchReason ging durch die SessionSwitchEventArgs , um herauszufinden, welche Art von Schalter ist und entsprechend reagieren.

Sie können mit ComponentDispatcher als Alternative Möglichkeit, diese Ereignisse zu erhalten.

Hier ist ein Beispiel-Klasse, die 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);
        }
    }
}

Sie absolut nicht brauchen WM_WTSSESSION_CHANGE Verwenden Sie einfach interne WTTS apis.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top