Pergunta

Duplicar:? Como posso programaticamente determinar se a minha estação de trabalho está bloqueada

Como posso detectar (durante a execução) quando um usuário do Windows bloqueou sua tela (Windows + L) e abriu-o novamente. Eu sei que poderia globalmente controlar a entrada de teclado, mas é possível verificar tal coisa com variáveis ??de ambiente?

Foi útil?

Solução

Você pode obter esta notificação através de uma mensagem WM_WTSSESSION_CHANGE. Você deve notificar o Windows que você deseja receber essas mensagens via WTSRegisterSessionNotification e cancelar o registro com WTSUnRegisterSessionNotification.

Essas mensagens devem ser útil para uma implementação 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 quando-estação de trabalho bloqueada

Outras dicas

A SessionSwitch evento pode ser sua melhor aposta por esta. Verifique a SessionSwitchReason passou pelo SessionSwitchEventArgs para descobrir que tipo de interruptor que é e reagir adequadamente.

Você pode usar ComponentDispatcher como uma forma alternativa para obter esses eventos.

Aqui está um exemplo de classe para embrulhar isso.

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);
        }
    }
}

Você absolutamente não precisa WM_WTSSESSION_CHANGE Basta usar WTTS internos apis.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top