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.

Programa residente que avisa cuando windows lo cierre

Foro de Xailer profesional en español
Responder
avitalini
Mensajes: 141
Registrado: Mié Ene 07, 2015 6:31 pm

Programa residente que avisa cuando windows lo cierre

Mensaje 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?
Avatar de Usuario
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

Mensaje por ignacio »

Buenos días,

Intente utilizar una EXIT PROCEDURE. Debería de ejecutarse su código en cualquier caso.

Un saludo
Ignacio Ortiz de Zúñiga
[Equipo de Xailer / Xailer team]
https://www.xailer.com
avitalini
Mensajes: 141
Registrado: Mié Ene 07, 2015 6:31 pm

Re: Programa residente que avisa cuando windows lo cierre

Mensaje 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.
Avatar de Usuario
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

Mensaje 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
Ignacio Ortiz de Zúñiga
[Equipo de Xailer / Xailer team]
https://www.xailer.com
avitalini
Mensajes: 141
Registrado: Mié Ene 07, 2015 6:31 pm

Re: Programa residente que avisa cuando windows lo cierre

Mensaje 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.
Avatar de Usuario
jfgimenez
Site Admin
Mensajes: 5706
Registrado: Lun Abr 06, 2015 8:48 pm
Contactar:

Re: Programa residente que avisa cuando windows lo cierre

Mensaje 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.
José F. Giménez
[Equipo de Xailer / Xailer team]
http://www.xailer.com
http://www.xailer.info
avitalini
Mensajes: 141
Registrado: Mié Ene 07, 2015 6:31 pm

Re: Programa residente que avisa cuando windows lo cierre

Mensaje por avitalini »

Lo pruebo y te comento.

Gracias!!
avitalini
Mensajes: 141
Registrado: Mié Ene 07, 2015 6:31 pm

Re: Programa residente que avisa cuando windows lo cierre

Mensaje 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!
Avatar de Usuario
jfgimenez
Site Admin
Mensajes: 5706
Registrado: Lun Abr 06, 2015 8:48 pm
Contactar:

Re: Programa residente que avisa cuando windows lo cierre

Mensaje 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.
José F. Giménez
[Equipo de Xailer / Xailer team]
http://www.xailer.com
http://www.xailer.info
Avatar de Usuario
emeasoft
Mensajes: 1088
Registrado: Mié Abr 01, 2009 4:12 pm
Ubicación: emeasoft
Contactar:

Re: Programa residente que avisa cuando windows lo cierre

Mensaje 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
avitalini
Mensajes: 141
Registrado: Mié Ene 07, 2015 6:31 pm

Re: Programa residente que avisa cuando windows lo cierre

Mensaje 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. // <--
Avatar de Usuario
emeasoft
Mensajes: 1088
Registrado: Mié Abr 01, 2009 4:12 pm
Ubicación: emeasoft
Contactar:

Re: Programa residente que avisa cuando windows lo cierre

Mensaje 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
avitalini
Mensajes: 141
Registrado: Mié Ene 07, 2015 6:31 pm

Re: Programa residente que avisa cuando windows lo cierre

Mensaje 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.
Avatar de Usuario
jfgimenez
Site Admin
Mensajes: 5706
Registrado: Lun Abr 06, 2015 8:48 pm
Contactar:

Re: Programa residente que avisa cuando windows lo cierre

Mensaje 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.
José F. Giménez
[Equipo de Xailer / Xailer team]
http://www.xailer.com
http://www.xailer.info
Responder