Página 1 de 1
Programa residente que avisa cuando windows lo cierre
Publicado: Vie Ago 14, 2015 11:32 pm
por avitalini
Hola!
Estoy haciendo una aplicación que necesita despedirse cuando cierra, si yo la cierro no hay problema, pero si Windows la cierra cuando apago windows, no se despide, solo deja de existir. ya probé en el evento onDestroy onDestroyed.
Despedirse = Marcar un registro como inactivo en una tabla DBF que sólo lo abre al arrancar y al cerrarse.
¿Qué me recomiendan hacer?
Re: Programa residente que avisa cuando windows lo cierre
Publicado: Sab Ago 15, 2015 8:32 pm
por ignacio
Buenos días,
Intente utilizar una EXIT PROCEDURE. Debería de ejecutarse su código en cualquier caso.
Un saludo
Re: Programa residente que avisa cuando windows lo cierre
Publicado: Lun Ago 17, 2015 5:53 pm
por avitalini
Ignacio:
Gracias por responder, pero no funcionó.
En el exit procedure puse un logFile( "Salida: "+Time() ) si cierro la aplicación crea el renglón nuevo, pero si cierro Windows, no queda registrado nada.
Re: Programa residente que avisa cuando windows lo cierre
Publicado: Mar Ago 18, 2015 5:12 pm
por ignacio
Pues es realmente extraño. Eso significa que Windows esta 'matando' el hilo de tu aplicación y no me parece muy elegante que se diga. Comprueba que no estás tu mismo provocando a Windows para matar el proceso. En concreto, comprueba que en el evento OnClose no estás haciendo nada que paralice la salida (incluso en MsgInfo).
Saludos
Re: Programa residente que avisa cuando windows lo cierre
Publicado: Mar Ago 18, 2015 5:34 pm
por avitalini
En el onClose pongo el Adios, y siempre regresa .t. en su return.
La única diferencia es que que la aplicación está oculta con ::hide() y se accede al ella con un tNotifyIcon de la bandeja del sistema.
Re: Programa residente que avisa cuando windows lo cierre
Publicado: Jue Ago 20, 2015 12:34 pm
por jfgimenez
Alejandro,
hay que utilizar los mensajes WM_QUERYENDSESSION y WM_ENDSESSION. Aquí tienes la documentación de MS:
Según esta documentación, hay que responder al mensaje WM_QUERYENDSESSION con el valor 1, y después hacer todo lo necesario para cerrar el programa al recibir WM_ENDSESSION, y devolver también 1. En Xailer lo puedes hacer añadiendo estos métodos a la clase del formulario principal:
Código: Seleccionar todo
METHOD WMQueryEndSession() INLINE 1
METHOD WMEndSession() // Desarrollar más abajo
Pruébalo y dinos si te funciona bien.
Re: Programa residente que avisa cuando windows lo cierre
Publicado: Jue Ago 20, 2015 5:09 pm
por avitalini
Lo pruebo y te comento.
Gracias!!
Re: Programa residente que avisa cuando windows lo cierre
Publicado: Jue Ago 20, 2015 11:45 pm
por avitalini
Funcionó a la perfección en windows 10, voy a probarlo en las versiones anteriores.
Así quedó
Código: Seleccionar todo
METHOD WMQueryEndSession() INLINE 1
METHOD WMEndSession()
//------------------------------------------------------------------------------
METHOD WMEndSession() CLASS tPrincipal
::Close()
RETURN 1
Mil gracias!
Re: Programa residente que avisa cuando windows lo cierre
Publicado: Mar Ago 25, 2015 2:19 pm
por emeasoft
Alejandro:
Sería posible adjuntar un pequeño ejemplo con esta rutina?
Gracias
Mário Angelini
Re: Programa residente que avisa cuando windows lo cierre
Publicado: Mar Ago 25, 2015 7:02 pm
por jfgimenez
Mario,
tan sólo hay que utilizar esos dos métodos. El primero tal cual, ya lo que hace es indicar a windows que hemos recibido el aviso de que se está cerrando. Y el segundo método sirve para cerrar ficheros y cualquier otra tarea que sea necesaria para cerrar el programa. Eso es todo.
Re: Programa residente que avisa cuando windows lo cierre
Publicado: Jue Ago 27, 2015 2:21 pm
por emeasoft
José:
Fiz o seguinte teste:
Código: Seleccionar todo
METHOD FormClose( oSender, @lClose )
METHOD FormInitialize( oSender )
METHOD WMQueryEndSession() INLINE 1
METHOD WMEndSession()
ENDCLASS
#include "Form1.xfm"
METHOD WMEndSession() CLASS TForm1
MsgInfo("ok")
::Close()
RETURN 1
Nada aconteceu.
Fiz novo teste:
Código: Seleccionar todo
METHOD FormClose( oSender, @lClose )
METHOD FormInitialize( oSender )
METHOD WMQueryEndSession() INLINE 1
METHOD WMEndSession()
ENDCLASS
#include "Form1.xfm"
METHOD WMEndSession() CLASS TForm1
::Close()
RETURN 1
METHOD FormClose( oSender, lClose ) CLASS TForm1
MsgInfo("OK")
RETURN Nil
Reinicio o Win (10) e nada acontece.
Pelo que entendi esta rotina deveria emitir uma mensagem de OK antes de encerrar o
Windows.
Está certo ?
Grato
Mário Angelini
Re: Programa residente que avisa cuando windows lo cierre
Publicado: Vie Ago 28, 2015 4:51 pm
por avitalini
Hola, perdón por la tardanza.
Prueba esto y revisa el archivo log.txt
Código: Seleccionar todo
METHOD WMEndSession() CLASS TForm1
logFile("Cerrando por solicitud de windows")
::Close()
RETURN 1
METHOD FormClose( oSender, lClose ) CLASS TForm1
logFile("Cerrando aplicación")
RETURN .t. // <--
Re: Programa residente que avisa cuando windows lo cierre
Publicado: Vie Ago 28, 2015 6:19 pm
por emeasoft
Hola.
Logfile() fica correto mas MsgInfo() nada acontece.
Serve apenas para isto então ?
Despedirse = Marcar un registro como inactivo en una tabla DBF que sólo lo abre al arrancar y al cerrarse.
Não tem como emitir um aviso pelo MsgInfo ?
Mário Angelini
Re: Programa residente que avisa cuando windows lo cierre
Publicado: Dom Ago 30, 2015 5:31 am
por avitalini
Supongo que entonces Windows ya no permite mas manejadores y no se crea el msg
Creo que tendrías que retornar 0 en lugar de 1 en el inline de la primer función.
Re: Programa residente que avisa cuando windows lo cierre
Publicado: Dom Ago 30, 2015 2:35 pm
por jfgimenez
Mario,
no se pueden mostrar mensajes una vez iniciado el proceso de cierre de windows. En cambio, LogFile() sí lo puedes usar, ya que no muestra nada en la pantalla.
En versiones antiguas de windows (95, 98, ME), un programa podía detener el cierre de windows devolviendo 0 en ese mensaje. Pero con las versiones actuales no se puede. Si un programa responde 1 al mensaje WM_QUERYENDSESSION, significa que se ha enterado, y windows le envía después el otro mensaje. Pero si no responde o responde con cualquier otro valor, windows simplemente lo "mata" para continuar con el cierre.
Re: Programa residente que avisa cuando windows lo cierre
Publicado: Lun Ago 31, 2015 3:10 pm
por emeasoft
Entendido !
Gracias
Mário