´

C# - Recibir notificaciones cuando hayan cambios de sesión parte 2 - Windows Forms


Esta es una copia cruzada de mi blog original.

Puedes leer el articulo original con código coloreado y demás utilidades en

C# – Recibir notificaciones cuando hayan cambios de sesión parte 2 – Windows Forms

---------------------- 

Artículos de este tema:

*Realmente son 6 articulos si contamos los mini post a los que se hace referencia

En mi artículo anterior enseñe como crear una librería para interceptar las notificaciones generadas en el sistema cuando se hacen cambios de sesión, en este artículo enseñare como hacer uso de ese componente en una aplicación para Windows Forms.

LETS CODE!

Divide y vencerás!, mi principio favorito. Seguiremos estos tres pasos:

  1. Registrar la ventana para recibir notificaciones
  2. Modificar el comportamiento del WndProc
  3. Des registrar la ventana para dejar de recibir notificaciones

He creado una aplicacion Windows Forms sencilla con un ListBox que se irá llenando a medida que lleguen notificaciones de cambios en las sesiones.

Registrar la ventana para recibir notificaciones

Para comenzar recibiendo notificaciones lo primero que debemos hacer es registrar nuestra Ventana, la Form, utilizando la API, para ello utilizamos la libreria que cree en C# - Recibir notificaciones cuando hayan cambios de sesión parte 1 simplemente usamos el evento load del form.

[csharp]

private void Form1_Load(object sender, EventArgs e)
{
    //Registramos la forma para recibir notificaciones
    W32HandleSessionChanges.WTSRegisterSessionNotification(this.Handle, NotifyType.NOTIFY_FOR_ALL_SESSIONS);
}
[/csharp]

Con esto nuestra ventana ya comienza a recibir notificaciones de cambios en las sesiones.

Modificar el comportamiento del WndProc

Aunque ya estamos recibiendo las notificaciones lo cierto es que no estamos haciendo nada con ellas, para interceptarlas y comenzar a hacer algo es necesario hacerle override al WndProc del form y capturar el mensaje de notificación que se envía desde el sistema de ventanas.

Una vez interceptado debemos revisar la propiedad wParam del mensaje ya que esta nos da detalles adicionales acerca del evento que se ha generado. Para efectos de este ejemplo simplemente convierto ese valor a su equivalente en los enum de la librería creada en el articulo previo, y adiciono esa cadena al listbox para que básicamente nos vaya mostrando los mensajes que van llegando.

En este caso paso como parámetro NOTIFY_FOR_ALL_SESSIONS para recibir notificaciones de cambios en todas las sesiones no solo en la actual

[csharp]
protected override void WndProc(ref Message m)
{
    //Verificamos cuando el mensaje recibido sea el de cambios en la sesión
    if (m.Msg == W32HandleSessionChanges.WM_WTSSESSION_CHANGE)
    {
        //convertimos el valor de wParam a su equivalente en nombre del enum
        var name = Enum.GetName(typeof(SessionNotificationMsg), (SessionNotificationMsg)m.WParam);
        this.listBox1.Items.Add(name);
    }
    base.WndProc(ref m);
}
[/csharp]

Des registrar la ventana para dejar de recibir notificaciones

Esta es la parte más fácil, antes de cerrar la ventana la des registramos:

[csharp]
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
    //Des Registramos la forma para no recibir notificaciones
    W32HandleSessionChanges.WTSUnRegisterSessionNotification(this.Handle);
}

[/csharp]

El resultado

Ejecutamos el programa

SNAGHTML582d4b8

 

Bloquemos nuestra sesión de Windows, volvemos a ingresar y…

SNAGHTML583c222

 

Perfecto!! Guiño

En un próximo articulo veremos como hacer lo mismo con WPF.

Posted: 10/6/2011 15:15 por Juan Carlos Ruiz Pacheco | con no comments |
Comparte este post: