In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.
Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.
Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.
Programa residente que avisa cuando windows lo cierre
Programa residente que avisa cuando windows lo cierre
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?
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?
- ignacio
- Site Admin
- Mensajes: 9253
- Registrado: Lun Abr 06, 2015 8:00 pm
- Ubicación: Madrid, Spain
- Contactar:
Re: Programa residente que avisa cuando windows lo cierre
Buenos días,
Intente utilizar una EXIT PROCEDURE. Debería de ejecutarse su código en cualquier caso.
Un saludo
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
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.
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.
- ignacio
- Site Admin
- Mensajes: 9253
- Registrado: Lun Abr 06, 2015 8:00 pm
- Ubicación: Madrid, Spain
- Contactar:
Re: Programa residente que avisa cuando windows lo cierre
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
Saludos
Re: Programa residente que avisa cuando windows lo cierre
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.
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
Alejandro,
hay que utilizar los mensajes WM_QUERYENDSESSION y WM_ENDSESSION. Aquí tienes la documentación de MS:
Pruébalo y dinos si te funciona bien.
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
Re: Programa residente que avisa cuando windows lo cierre
Lo pruebo y te comento.
Gracias!!
Gracias!!
Re: Programa residente que avisa cuando windows lo cierre
Funcionó a la perfección en windows 10, voy a probarlo en las versiones anteriores.
Así quedó
Mil gracias!
Así quedó
Código: Seleccionar todo
METHOD WMQueryEndSession() INLINE 1
METHOD WMEndSession()
//------------------------------------------------------------------------------
METHOD WMEndSession() CLASS tPrincipal
::Close()
RETURN 1
Re: Programa residente que avisa cuando windows lo cierre
Alejandro:
Sería posible adjuntar un pequeño ejemplo con esta rutina?
Gracias
Mário Angelini
Sería posible adjuntar un pequeño ejemplo con esta rutina?
Gracias
Mário Angelini
Re: Programa residente que avisa cuando windows lo cierre
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.
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
José:
Fiz o seguinte teste:
Nada aconteceu.
Fiz novo teste:
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
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
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
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
Hola, perdón por la tardanza.
Prueba esto y revisa el archivo log.txt
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
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
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
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.
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
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.
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.