comment
IRC Chat
play_arrow
Este sitio utiliza cookies propias y de terceros. Si continúa navegando consideramos que acepta el uso de cookies. OK Más Información.

Cerrando programa WinForms tras 15 minutos de inactividad

  • 0 Respuestas
  • 122 Vistas

0 Usuarios y 1 Visitante están viendo este tema.

Conectado solid water

  • *
  • Underc0der
  • Mensajes: 16
  • Actividad:
    23.33%
  • Reputación 0
    • Ver Perfil
« en: Octubre 11, 2018, 03:53:38 pm »
Cerrar programa winforms tras 15 minutos de inactividad por parte del usuario.
No parece tan difícil pero veamos como después se complica un poco.
Supongamos que tenemos un formulario padre con 2 botones que llama a los formularios hijos:



Código: C#
  1.    private void button1_Click(object sender, EventArgs e)
  2.         {
  3.             Form form2 = No tienes permisos para ver links. Registrate o Entra con tu cuenta Form2();
  4.             form2.Show();
  5.         }
  6.  
  7.         private void button2_Click(object sender, EventArgs e)
  8.         {
  9.             Form form3 = No tienes permisos para ver links. Registrate o Entra con tu cuenta Form3();
  10.             form3.Show();
  11.         }



Bueno para controlar los 15 minutos utilizaremos un timmer que agregaremos al formulario 1 y setearemos que cada 1 minuto suba 1 punto el contador al llegar a 15 minutos sin actividad cerraríamos el programa.

En el form1 load declaramos que el timmer llamara a la función TimerEventProcessor cada 1 minuto:
Código: C#
  1.             timer1.Interval = 60000;
  2.             timer1.Tick += No tienes permisos para ver links. Registrate o Entra con tu cuenta EventHandler(TimerEventProcessor);
  3.             timer1.Start();

Y en la función nuestro contador aumentará de 1 en 1 y si llega a 15 cerrará el programa:

Código: C#
  1. private void TimerEventProcessor(object sender, EventArgs e)
  2.         {
  3.             _counter++;
  4.            
  5.             if (_counter == 15)
  6.             {
  7.                
  8.                 Environment.Exit(1);
  9.                 this.Close();
  10.             }
  11.         }

Cabe destacar que la variable counter es un static int declarado como dato miembro de form1.

Código: C#
  1. static int _counter;

Bueno todo muy lindo, pero ahora faltaría que cada vez que se presione una tecla o se haga click en algun control de cualquiera de los formularios la variable counter vuelva a 0 así vuelven a contarse los 15 minutos desde la última vez que hubo actividad del usuario.

Para eso debemos delegar a los controles la función que vuelve el contador a 0.

Código: C#
  1. public static void mdiPrincipal_Click(object sender, EventArgs e)
  2. {
  3.             _counter = 0;
  4.             MessageBox.Show("Click or keypressed");
  5. }

Como estamos testeando le puse a la función un messagebox que me avisa que hubo un click o key pressed.
Pero todavía nos falta delegarle dicha función, a los eventos click y keypress de todos los controles de los formularios.
Sin lugar a dudas hacerlo 1 por 1 sería una solución horrible.
Para delegar la función a los eventos keypressed y click podemos usar un código como el siguiente:

Código: C#
  1. foreach (Control control in Controls)
  2. {
  3.  
  4.         control.Click += No tienes permisos para ver links. Registrate o Entra con tu cuenta System.EventHandler(mdiPrincipal_Click);
  5.         control.KeyDown += No tienes permisos para ver links. Registrate o Entra con tu cuenta KeyEventHandler(mdiPrincipal_Click);
  6. }

Pero el código tiene un problema, cuando el control con el que se encuentra el foreach es un groupBox, este tiene
anidado los controles dentro de el, por lo que se saltiaría todos los controles dentro de groupboxs.
Para solucionarlo podemos decir que si es un group box, recorra los elementos que hay dentro de este último 1 por 1 como lo hace con los de los formularios. El siguiente código funcionaría en caso de que haya como máximo 2 group box (anidados) o cualquier cantidad sin anidar en el formulario:

Código: C#
  1. foreach (Control control in Controls)
  2.             {
  3.                 if (control No tienes permisos para ver links. Registrate o Entra con tu cuenta GroupBox)
  4.                 {
  5.                     foreach (Control controlinside in control.Controls)
  6.                     {
  7.                         if (controlinside No tienes permisos para ver links. Registrate o Entra con tu cuenta GroupBox)
  8.                         {
  9.                             foreach (Control controlinside2 in controlinside.Controls)
  10.                             {
  11.                                 controlinside2.Click += No tienes permisos para ver links. Registrate o Entra con tu cuenta System.EventHandler(mdiPrincipal_Click);
  12.                                 controlinside2.KeyDown += No tienes permisos para ver links. Registrate o Entra con tu cuenta KeyEventHandler(mdiPrincipal_Click);
  13.                             }
  14.                         }
  15.                         else
  16.                         {
  17.  
  18.                             controlinside.Click += No tienes permisos para ver links. Registrate o Entra con tu cuenta System.EventHandler(mdiPrincipal.mdiPrincipal_Click);
  19.                             controlinside.KeyDown += No tienes permisos para ver links. Registrate o Entra con tu cuenta KeyEventHandler(mdiPrincipal.mdiPrincipal_Click);
  20.                         }
  21.                     }
  22.                 }
  23.                 else
  24.                 {
  25.  
  26.                     control.Click += No tienes permisos para ver links. Registrate o Entra con tu cuenta System.EventHandler(mdiPrincipal.mdiPrincipal_Click);
  27.                     control.KeyDown += No tienes permisos para ver links. Registrate o Entra con tu cuenta KeyEventHandler(mdiPrincipal.mdiPrincipal_Click);
  28.                 }
  29.             }

Pero que pasaría si hubiera más de 2 group box no podemos hardcodear todo así. Debemos hacerlo de un modo más prolijo.
Para eso creé una función que utiliza recursividad con los group box volviendo a llamarse una y otra vez siempre y cuando encuentre otro group box anidado.
En conclusión creé 2 funciones la principal (AddEvents) que "si es un group box llama a la recursiva" y si no agrega los eventos a cada control, y la recursiva que se encarga de los group box y group box anidados en otros group box.

Código: C#
  1. public static void AddEvents(Form form){
  2.              
  3.             foreach (Control control in form.Controls)
  4.             {
  5.                
  6.                 if(recursiva(control)){
  7.  
  8.                 }
  9.                 else
  10.                 {
  11.  
  12.                     control.Click += No tienes permisos para ver links. Registrate o Entra con tu cuenta System.EventHandler(mdiPrincipal_Click);
  13.                     control.KeyDown += No tienes permisos para ver links. Registrate o Entra con tu cuenta KeyEventHandler(mdiPrincipal_Click);
  14.                 }
  15.             }
  16.        }
  17.  
  18.  
  19.         public static bool recursiva(Control control){
  20.  
  21.              if (control No tienes permisos para ver links. Registrate o Entra con tu cuenta GroupBox)
  22.              {  
  23.                    foreach (Control controlinside in control.Controls)
  24.                    {
  25.                        if (recursiva(controlinside))
  26.                         {
  27.  
  28.  
  29.                          }else{
  30.  
  31.                            controlinside.Click += No tienes permisos para ver links. Registrate o Entra con tu cuenta System.EventHandler(mdiPrincipal_Click);
  32.                            controlinside.KeyDown += No tienes permisos para ver links. Registrate o Entra con tu cuenta KeyEventHandler(mdiPrincipal_Click);
  33.                         }
  34.                    }
  35.  
  36.                     return true;
  37.  
  38.               }else{
  39.  
  40.                         return false;
  41.  
  42.                   }
  43.  
  44.         }

Por último, nos queda en todos los form loads, llamar a:
Código: C#
  1. AddEvents(this);

Como podrán ver para testearlo en un formulario anidé muchos groupbox con controles dentro:



Más tarde les dejo el proyecto para descargar que ahora no estoy en casa.

Autor: Solid Water (Matías).

PD: Seguramente podría hacerse de algún modo con hooking o capturar algún evento más, pero bueno todo depende de para que queramos usarlo, podría ser mejor o peor.

Saludos,
« Última modificación: Octubre 11, 2018, 05:01:58 pm por solid water »

 

¿Te gustó el post? COMPARTILO!



[C#] Source de un programa para completar ofertas de offerwalls.

Iniciado por ragaza

Respuestas: 0
Vistas: 336
Último mensaje Mayo 19, 2018, 03:24:39 pm
por ragaza