C# – Recibir notificaciones cuando hayan cambios de sesión parte 2 – Windows Forms
June 2nd, 2011 by JuanK
Artículos de este tema:
- C# – Recibir notificaciones cuando hayan cambios de sesión parte 1
- C# – Recibir notificaciones cuando hayan cambios de sesión parte 2 – Windows Forms
- C# – Recibir notificaciones cuando hayan cambios de sesión parte 3 – WPF
*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:
- Registrar la ventana para recibir notificaciones
- Modificar el comportamiento del WndProc
- 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.
private void Form1_Load(object sender, EventArgs e) { //Registramos la forma para recibir notificaciones W32HandleSessionChanges.WTSRegisterSessionNotification(this.Handle, NotifyType.NOTIFY_FOR_ALL_SESSIONS); }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
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); }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:
private void Form1_FormClosed(object sender, FormClosedEventArgs e) { //Des Registramos la forma para no recibir notificaciones W32HandleSessionChanges.WTSUnRegisterSessionNotification(this.Handle); }El resultado
Ejecutamos el programa
Bloquemos nuestra sesión de Windows, volvemos a ingresar y…
Perfecto!!
En un próximo articulo veremos como hacer lo mismo con WPF.
- 4 Comentarios »
- Publicado en la categoría 'C#, Windows'



Wordpress
4 comentarios to “C# – Recibir notificaciones cuando hayan cambios de sesión parte 2 – Windows Forms ”
June 2nd, 2011 at 5:20 pm
[...] Windows forms esta tarea es bastante sencilla e intuitiva, pero este no es el caso de WPF dadas las propias [...]
June 3rd, 2011 at 12:37 am
[...] C# – Recibir notificaciones cuando hayan cambios de sesión parte 2 – Windows Form… [...]
June 10th, 2011 at 12:08 pm
[...] C# – Recibir notificaciones cuando hayan cambios de sesión parte 2 – Windows Form… [...]
June 22nd, 2011 at 9:01 am
Hello,
Thanks for the great tutorial. Can you give an example of a service that receives session change notifications? I couldn’t figure out how to get the “handle ” when not using forms – any help would be appreciated.
Thank you,
Chris G.