En esta entrada mostramos como implementar en Windows 8 acciones programadas o temporizadas (conocidas como timed actions) en las que se monitorizan una serie de eventos para determinar la inactividad de una aplicación.

Hace algún tiempo tuvimos que realizar un trabajo sobre una aplicación en Windows 8.1 en la que uno de los requisitos principales era la implementación de acciones programadas o temporizadas (timed actions).

La aplicación se estaba utilizando en una conocida tienda de ropa de diseño, donde el usuario puede acceder al catálogo de la tienda y realizar compras online desde la propia app. Así que el requisito exacto era realizar un cierre de sesión cronometrado mediante la determinación la actividad de la aplicación cada cierto tiempo, de modo que si un usuario ha iniciado una sesión en la aplicación y ha transcurrido el tiempo de la sesión entonces la aplicación debe mantener el estado tal como la dejó. (el usuario no debe notar que se cerró la sesión).

Así que implementamos un cierre de sesión programado de forma que si no hay ningún puntero, el ratón o interacción con el teclado desde X minutos del cierre de sesión se realizará de forma automática.

Al lío

En esta entrada mostramos como implementar este tipo de acción temporizada. Por ejemplo, si una aplicación se está utilizando en los lugares públicos y quieres mostrar una imagen por defecto o un salvapantallas si hay una inactividad de ciertos minutos, ahora veremos cómo hacerlo.

Básicamente para determinar la inactividad, tienes que monitorizar estos tres eventos:

1. Pointer pressed
2. Pointer moved
3. Keyboard key pressed

Para la monitorización de dichos eventos, debemos usar los eventos PointerMoved y PointerPressed de la clase Window.Current.CoreWindow y AcceleratorKeyActivated de la clase CoreDispatcher para eventos generados por el teclado. CoreDispatcher es el encargado de manejar los eventos dentro del Runtimes de Windows (tratamos esto en un articulo previo, últimamente no salimos de programación relacionada con WinRT) y que procesa los mensajes que genera la interfaz y procesa los eventos al cliente.

El aspecto más importante en las acciones programadas es el timer. La clase DispatcherTimer proporciona acceso al mismo y permite ejecutar ciertas acciones después de un intervalo de tiempo. Esta clase proporciona los métodos Start() y Stop() para la gestión de dicho timer (o temporizador propiamente dicho). Tiene, además, un evento Tick, que representa la acción ejecutada después de proporcionar el intervalo de tiempo.

Ahora bien, si hay algún tipo de inactividad después nunca ocurrirán esos tres eventos. Si hay actividad entonces se producirán esos tres eventos, por lo que el temporizador se pondrá reiniciar llamando al método Start. El método Start() (re)inicia el temporizador. Si no hay actividad y el temporizador completa el intervalo, a continuación se lanza el evento Tick que contiene la lógica de la acción programada.

Un simple ejemplo

En el siguiente ejemplo se muestra un ejemplo de esto. Después de una actividad de 2 minutos se llama al método logout()

DispatcherTimer Timer;

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    InitializeTimer();
} 

private void InitializeTimer()
{
    Dispatcher.AcceleratorKeyActivated += Dispatcher_AcceleratorKeyActivated;
    Window.Current.CoreWindow.PointerMoved += CoreWindow_PointerMoved;
    Window.Current.CoreWindow.PointerPressed += CoreWindow_PointerPressed; 

    Timer = new DispatcherTimer();
    Timer.Interval = TimeSpan.FromMinutes(2);
    Timer.Tick += (ss, ee) => Logout();
    Timer.Start();
} 

void CoreWindow_PointerPressed(CoreWindow sender, PointerEventArgs args)
{
    Timer.Start();
} 

void CoreWindow_PointerMoved(CoreWindow sender, PointerEventArgs args)
{
    Timer.Start();
} 

void Dispatcher_AcceleratorKeyActivated(CoreDispatcher sender,
    AcceleratorKeyEventArgs args)
{
    Timer.Start();
}

private void Logout()
{
    Timer.Stop();
    //TODO: Lógica del logout()
}