Проверка изменения блокировки/разблокировки рабочей станции с помощью С#

StackOverflow https://stackoverflow.com/questions/603484

Вопрос

ДУБЛИКАТ: Как я могу программно определить, заблокирована ли моя рабочая станция?

Как я могу обнаружить (во время выполнения), когда пользователь 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top