Überprüfen auf Arbeitsplatz Sperren / Entsperren Änderung mit c #
-
03-07-2019 - |
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?
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.