2009-09-14 21 views
9

Algunos antecedentes: Escribo una aplicación con varios formularios, etc. Los usuarios tienen que iniciar sesión para poder usar la mayoría de las funciones, y esto funcionó bien hasta ahora. Sin embargo, ahora, el cliente ha solicitado que el usuario se desconecte después de una cierta cantidad de tiempo inactivo. El problema es que el usuario aún puede estar activo en la computadora, pero no en mi aplicación. Para que quede claro, tengo que desconectar al usuario cuando está inactivo en mi aplicación, incluso si todavía está interactuando con el escritorio.C# Durante cuánto tiempo estuvo inactivo el usuario

Primero pensé que esto sería bastante simple. Simplemente recuerde la hora de la última acción, compárela continuamente en un temporizador con la hora actual y cierre la sesión del usuario si el tiempo transcurrido es mayor que el tiempo permitido. Sin embargo, me he dado cuenta de que la búsqueda de la última vez que la acción no puede ser tan simple ...

Por supuesto que podría copiar y pegar algo así como

Program.LastActionTime = DateTime.Now; 

en todos los AlCambiar, onclick, etc, evento ... Sin embargo, no solo eso sería una gran cantidad de trabajo debido al tamaño de la aplicación ... También sería una muy mala práctica y estoy seguro de que se olvidaría al menos una vez, haciendo que todo esto no sea confiable (y aparece roto, el error sería casi imposible de reproducir!)

Entonces, ¿hay una manera mejor?

Respuesta

0

¿Engancha un controlador de eventos en los eventos MouseMove y KeyPressed, y luego verifica el enfoque dentro de ese evento?

0

En general, sería la mejor idea derivar esta información de la lógica de la aplicación en lugar de la entrada del usuario sin procesar, pero supongo que no tiene una infraestructura flexible (tal vez usando el command pattern) que podría proporcionar esta información.

Así que sugiero simplemente registrar manejadores con su formulario principal - si recibe clics o eventos clave (habilite Form.KeyPreview para esto), su usuario está activo y puede restablecer el tiempo de inactividad.

0

Puede crear una clase base de la que hereden todas sus formas de ventana. En la clase base, verifica y restablece el tiempo de espera en cada KeyPress o Click.

6

Un método que he utilizado en el pasado para crear un MessageFilter en el formulario de solicitud y comprobar si hay ciertos tipos de eventos que indican la actividad del usuario:

public class UserActivityFilter : IMessageFilter 
{ 
     // Define WinAPI window message values (see pinvoke.net) 
     private int WM_LBUTTONDOWN = 0x0201; 
     private int WM_MBUTTONDOWN = 0x0207; 
     private int WM_RBUTTONDOWN = 0x0204; 
     private int WM_MOUSEWHEEL = 0x020A; 
     private int WM_MOUSEMOVE = 0x0200; 
     private int WM_KEYDOWN = 0x0100; 

     public bool PreFilterMessage(ref Message m) 
     { 
      if (m.Msg == WM_LBUTTONDOWN || m.Msg == WM_MBUTTONDOWN || m.Msg == WM_RBUTTONDOWN || m.Msg == WM_MOUSEWHEEL || m.Msg == WM_MOUSEMOVE || m.Msg == WM_KEYDOWN) 
      { 
       //User activity has occurred 
       // Reset a flag/timer etc. 
      } 
      return false; 
     } 
    } 

Luego, en el método main() de la formar, antes de llamar a run():

Application.AddMessageFilter(new UserActivityFilter()); 

una advertencia, la adición de un filtro de mensajes de complejo o la adición de varios filtros separados puede ralentizar la capacidad de respuesta de la aplicación.

1

Puede anular WndProc, actualizar Program.LastActionTime en cada mensaje de evento Keyboard/Mouse relevante.

Cuestiones relacionadas