2009-03-02 11 views
7

DUPLICADO:How can I programmatically determine if my workstation is locked?Comprobación de estación de trabajo de cambio de bloqueo/desbloqueo con C#

¿Cómo puedo detectar que (durante el tiempo de ejecución) cuando un usuario de Windows ha bloqueado la pantalla (Windows + L) y la abrió de nuevo. Sé que podría hacer un seguimiento global de la entrada del teclado, pero ¿es posible verificarlo con variables de entorno?

+0

Las respuestas a esta pregunta pueden proporcionar un punto de partida para usted. http://stackoverflow.com/questions/44980 –

+0

Gracias a todos. Usted fue muy útil como siempre :) –

Respuesta

3

Puede recibir esta notificación a través de un mensaje WM_WTSSESSION_CHANGE. Debe notificar a Windows que desea recibir estos mensajes a través de WTSRegisterSessionNotification y anular el registro con WTSUnRegisterSessionNotification.

Estas publicaciones deberían ser útiles para la implementación de 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

+0

Batirme por unos segundos :) – shahkalpesh

+0

-1: La versión del código administrado de esto fue publicada antes de que la versión de Win32 fuera ... ¿por qué está marcada como la respuesta correcta? – Powerlord

+0

Apenas una razón para un voto negativo, ¿eh? –

-2

A pesar de todo no es necesario WM_WTSSESSION_CHANGE Sólo tiene que utilizar las API wtts internos.

2

Puede usar ComponentDispatcher como una forma alternativa de obtener esos eventos.

Aquí hay una clase de ejemplo para ajustar eso.

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