Проверка изменения блокировки/разблокировки рабочей станции с помощью С#
-
03-07-2019 - |
Вопрос
ДУБЛИКАТ: Как я могу программно определить, заблокирована ли моя рабочая станция?
Как я могу обнаружить (во время выполнения), когда пользователь Windows заблокировал свой экран (Windows+L) и снова разблокировал его.Я знаю, что могу глобально отслеживать ввод с клавиатуры, но можно ли проверить это с помощью переменных среды?
Решение
Вы можете получить это уведомление через сообщение WM_WTSSESSION_CHANGE.Вы должны уведомить Windows о своем желании получать эти сообщения через WTSRegisterSessionNotification и отменить регистрацию с помощью WTSUnRegisterSessionNotification.
Эти сообщения должны быть полезны для реализации C#.
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
Другие советы
А Сессионный переключатель событие может быть лучшим выбором для этого.Проверить SessionSwitchReason прошел через Сеанссвичевентаргс чтобы узнать, что это за переключатель, и отреагировать соответствующим образом.
Вы можете использовать ComponentDispatcher
как альтернативный способ получить эти события.
Вот пример класса, который может это обернуть.
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);
}
}
}
Вам абсолютно не нужно wm_wtssession_change, просто используйте внутренние API WTTS.