none
Cerrar formulario durnate un tiempo RRS feed

  • Pregunta

  • Buenas a todos otra vez por aki.

    bueno nesecito saber como se puede hacer que un formulario se cierre automaticamente cuando note que no hay actividad en el, y vuelva la formulario principal.
    miércoles, 22 de abril de 2009 11:38

Respuestas

  • La mejor forma de detectar actividad es controlando los Click y las entradas e teclado,

    para ello debes hacer dos cosas

    1-habilitar el KeyPreview del form
    2-crear un evento click comun a todos los controles.

    miremos

    Si un usuario da click... esta activo
    si un usuario presiona una tecla... esta activo

    Para controlar las teclas es mas sencillo, se debe establecer la Propiedad KeyPreview del Form a true.
    Para el mouse es diferente, pero no es tan dificil.

    A cada Control del form le pondremos codigo para que en el evento Click coloque una variable boolena en true, y tambien haremos lo mismo en el evento KeyPress del Form.

    La idea es que cada determinado tiempo se dispare un timer que revise la actividad, si esta esta en true la vuelve false e inicia un conteo para cerrar la aplicacion (el valor lo estableces tu), mientras que cada vez que haces click o presionas una tecla la variable de actividad se vuelva true y de paso suspendamos el conteo que haya en el timer y lo activemos para solo dos segundos, de tal manera que tras 2 segundos de actividad se inicie el conteo regresivo con el timpo que tu estableciste...


    asi se hace:




    1. crea una variable que se llame indicador de inactividad
    2. inserta en el form un control timer,  dejalo con enabled=true y configura la propiedad interval a 2000
    3. Crea una funcion RestablecerTimer con el siguiente código

            private void RestablecerTimer(int intervalo)
            {
                timer1.Stop();
                timer1.Interval = intervalo;
                timer1.Start();
            }
    4. Ahora crea una funcion RevisarActividad así:

            private bool indicadorDeActividad = true;
            private void RevisarActividad(object sender, EventArgs a)
            {
                indicadorDeActividad = true;
                RestablecerTimer(2000);
            }
    


    5. A cada control del form debes indicarle que en el evento Click marque como actividad, esto lo haces despues del llamado a Initialize asi

                foreach (Control c in this.Controls)
                    c.Click += RevisarActividad;

    6. Al evento KeyPress del Form le haces lo mismo, justo despues del codigo anterior
    this.KeyPress += RevisarActividad;

    7. ya con lo anterior en el evento Tick del timer coloca este código:

                if (!indicadorDeActividad)
                {
                    Application.Exit();
                }
                else
                {
                    indicadorDeActividad = false;
                    RestablecerTimer(15000);
                }

    Este es el codigo completo:

            private bool indicadorDeActividad = true; 
    
            public Form1()
            {
                InitializeComponent();
      
                this.KeyPress += RevisarActividad;
                foreach (Control c in this.Controls)
                    c.Click += RevisarActividad;
            }
            
            private void RevisarActividad(object sender, EventArgs a)
            {
                indicadorDeActividad = true;
                RestablecerTimer(2000);
            }
            
            private void RestablecerTimer(int intervalo)
            {
                timer1.Stop();
                timer1.Interval = intervalo;
                timer1.Start();
            }
    
            private void timer1_Tick(object sender, EventArgs e)
            {
                if (!indicadorDeActividad)
                {
                    Application.Exit();
                }
                else
                {
                    indicadorDeActividad = false;
                    RestablecerTimer(15000);
                }
            }
    miércoles, 22 de abril de 2009 14:16
    Moderador
  • si te refieres a mi respuesta:

    Recuerda ir a ls propiedades del timer , estabelecer Enabled =  true e Interval= 2000.


    ahh y claro recuerda que el codigo no lo debes copiar todo tal cual , crea el evento Tick de tu timer y alli copia lo que hay en el metodo tick que te pase...

    saludos.


    Colabora con la comunidad, si éste mensaje te ha sido de utilidad, márcalo como respuesta correcta.
    Juan Carlos Ruiz Pacheco
    Ingeniero de Sistemas
    Microsoft MVP C#
    MCP,MCTS,DCE+Platino,OCA,OCP
    Blog Técnico
    jueves, 23 de abril de 2009 13:56
    Moderador
  • creasate el timer dentro de la forma que estas temporizando...?
    el codigo esta dentro del codigo de la forma...?


    Colabora con la comunidad, si éste mensaje te ha sido de utilidad, márcalo como respuesta correcta.
    Juan Carlos Ruiz Pacheco
    Ingeniero de Sistemas
    Microsoft MVP C#
    MCP,MCTS,DCE+Platino,OCA,OCP
    Blog Técnico
    jueves, 23 de abril de 2009 14:56
    Moderador

Todas las respuestas

  • Hola Malacky,

    Puedes poner un temporizador cuando se lanza el formulario de manera que, cuando venza el temporizador, compruebes si ha habido actividad (detectado eventos) en algunos de los controles que contiene.
    Por ejemplo, imagina que el formulario contiene un TextBox en el que se establece el foco. Al vencer el temporizador puedes comprobar si durante este tiempo se ha producido algún evento de cambio de texto - TextChanged. Puedes realizar esta comprobación sobre el número de controles que consideres necesario y que defina lo que significa para ti el concepto "sin actividad".

    Espero que te resulte útil,



    Si este mensaje responde a tu pregunta, márcalo como respuesta correcta o vótalo como útil.
    Sergio Ortiz
    i-Card Software CTO

    View Sergio Ortiz's profile on LinkedIn View Sergio Ortiz's profile on Xing
    miércoles, 22 de abril de 2009 12:04
  • La mejor forma de detectar actividad es controlando los Click y las entradas e teclado,

    para ello debes hacer dos cosas

    1-habilitar el KeyPreview del form
    2-crear un evento click comun a todos los controles.

    miremos

    Si un usuario da click... esta activo
    si un usuario presiona una tecla... esta activo

    Para controlar las teclas es mas sencillo, se debe establecer la Propiedad KeyPreview del Form a true.
    Para el mouse es diferente, pero no es tan dificil.

    A cada Control del form le pondremos codigo para que en el evento Click coloque una variable boolena en true, y tambien haremos lo mismo en el evento KeyPress del Form.

    La idea es que cada determinado tiempo se dispare un timer que revise la actividad, si esta esta en true la vuelve false e inicia un conteo para cerrar la aplicacion (el valor lo estableces tu), mientras que cada vez que haces click o presionas una tecla la variable de actividad se vuelva true y de paso suspendamos el conteo que haya en el timer y lo activemos para solo dos segundos, de tal manera que tras 2 segundos de actividad se inicie el conteo regresivo con el timpo que tu estableciste...


    asi se hace:




    1. crea una variable que se llame indicador de inactividad
    2. inserta en el form un control timer,  dejalo con enabled=true y configura la propiedad interval a 2000
    3. Crea una funcion RestablecerTimer con el siguiente código

            private void RestablecerTimer(int intervalo)
            {
                timer1.Stop();
                timer1.Interval = intervalo;
                timer1.Start();
            }
    4. Ahora crea una funcion RevisarActividad así:

            private bool indicadorDeActividad = true;
            private void RevisarActividad(object sender, EventArgs a)
            {
                indicadorDeActividad = true;
                RestablecerTimer(2000);
            }
    


    5. A cada control del form debes indicarle que en el evento Click marque como actividad, esto lo haces despues del llamado a Initialize asi

                foreach (Control c in this.Controls)
                    c.Click += RevisarActividad;

    6. Al evento KeyPress del Form le haces lo mismo, justo despues del codigo anterior
    this.KeyPress += RevisarActividad;

    7. ya con lo anterior en el evento Tick del timer coloca este código:

                if (!indicadorDeActividad)
                {
                    Application.Exit();
                }
                else
                {
                    indicadorDeActividad = false;
                    RestablecerTimer(15000);
                }

    Este es el codigo completo:

            private bool indicadorDeActividad = true; 
    
            public Form1()
            {
                InitializeComponent();
      
                this.KeyPress += RevisarActividad;
                foreach (Control c in this.Controls)
                    c.Click += RevisarActividad;
            }
            
            private void RevisarActividad(object sender, EventArgs a)
            {
                indicadorDeActividad = true;
                RestablecerTimer(2000);
            }
            
            private void RestablecerTimer(int intervalo)
            {
                timer1.Stop();
                timer1.Interval = intervalo;
                timer1.Start();
            }
    
            private void timer1_Tick(object sender, EventArgs e)
            {
                if (!indicadorDeActividad)
                {
                    Application.Exit();
                }
                else
                {
                    indicadorDeActividad = false;
                    RestablecerTimer(15000);
                }
            }
    miércoles, 22 de abril de 2009 14:16
    Moderador
  • buenas lo he probado pero no me hace nada me sale el formulacion con los datos, espero sin hacer nada durante unois minutos y no cierra el formulario.
    jueves, 23 de abril de 2009 12:47
  • si te refieres a mi respuesta:

    Recuerda ir a ls propiedades del timer , estabelecer Enabled =  true e Interval= 2000.


    ahh y claro recuerda que el codigo no lo debes copiar todo tal cual , crea el evento Tick de tu timer y alli copia lo que hay en el metodo tick que te pase...

    saludos.


    Colabora con la comunidad, si éste mensaje te ha sido de utilidad, márcalo como respuesta correcta.
    Juan Carlos Ruiz Pacheco
    Ingeniero de Sistemas
    Microsoft MVP C#
    MCP,MCTS,DCE+Platino,OCA,OCP
    Blog Técnico
    jueves, 23 de abril de 2009 13:56
    Moderador
  • bueno eso lo echo antes pero ahora resulta me me dice

     private
     void
     RestablecerTimer(int
     intervalo)
    {
    timer1.Stop();
    timer1.Interval = intervalo;
    timer1.Start();
    }

    timer1 no existe en el contexto
    jueves, 23 de abril de 2009 14:22
  • creasate el timer dentro de la forma que estas temporizando...?
    el codigo esta dentro del codigo de la forma...?


    Colabora con la comunidad, si éste mensaje te ha sido de utilidad, márcalo como respuesta correcta.
    Juan Carlos Ruiz Pacheco
    Ingeniero de Sistemas
    Microsoft MVP C#
    MCP,MCTS,DCE+Platino,OCA,OCP
    Blog Técnico
    jueves, 23 de abril de 2009 14:56
    Moderador