Проверка блокировки / разблокировки рабочей станции с помощью c # - PullRequest
7 голосов
/ 02 марта 2009

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

Как я могу обнаружить (во время выполнения), когда пользователь Windows заблокировал свой экран (Windows + L) и снова разблокировал его. Я знаю, что могу глобально отслеживать ввод с клавиатуры, но можно ли проверить это с помощью переменных среды?

Ответы [ 4 ]

15 голосов
/ 02 марта 2009

A SessionSwitch событие может быть лучшим выбором для этого. Проверьте SessionSwitchReason , переданный через SessionSwitchEventArgs , чтобы выяснить, какой это тип переключателя, и отреагировать соответствующим образом.

3 голосов
/ 02 марта 2009

Вы можете получить это уведомление через сообщение 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

2 голосов
/ 20 декабря 2013

Вы можете использовать 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);
        }
    }
}
0 голосов
/ 02 марта 2009

Вам абсолютно не нужно WM_WTSSESSION_CHANGE Просто используйте внутренний API WTTS.

...