Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > API de Windows
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 23-11-2005
Avatar de MDSato
MDSato MDSato is offline
Miembro
 
Registrado: nov 2005
Posts: 17
Poder: 0
MDSato Va por buen camino
Unhappy Cerrar aplicación al apagar el sistema

Estimados colegas,

Tengo un problema con el apagado del sistema y la aplicación que desarrollo. Lo que me gustaría conseguir es que cuando apaguen el sistema (esto es, CERRAR SESION, APAGAR EL SISTEMA o REINICIAR) mi aplicación se cerrara automáticamente.

He aplicado dos soluciones descritas en este foro. Una la de Roman (http://www.clubdelphi.com/foros/show...60&postcount=2) redefiniendo los mensajes de este modo:

Código Delphi [-]
procedure TFormMainImpre.WMQueryEndSession (var Msg : TWMQueryEndSession);
begin
     Msg.Result := 1;
end;
 
procedure TFormMainImpre.WMEndSession (var Msg : TWMEndSession);
begin
     Msg.EndSession := True;
     Msg.Result := 1;
     Close;
     inherited;
end;

y también he probado con la solución descrita aquí: http://www.delphifaq.com/faq/delphi/vcl/f285.shtml

Con las dos alternativas consigo lo mismo... Efectivamente mi aplicación se cierra correctamente. El problema es que por algún motivo, detiene el apagado de Windows que se ha solicitado, y por tanto el ordenador continua encendido (aunque con mi aplicación cerrada). ¿Alguien podría darme alguna orientación al respecto?
Muchas gracias por adelantado.

Última edición por dec fecha: 08-11-2006 a las 23:51:42.
Responder Con Cita
  #2  
Antiguo 23-11-2005
Avatar de vtdeleon
vtdeleon vtdeleon is offline
Miembro
 
Registrado: abr 2004
Ubicación: RD & USA
Posts: 3.236
Poder: 24
vtdeleon Va por buen camino
Saludos

Tienes algun codigo en el evento OnCloseQuery del formulario Principal?
__________________
Van Troi De León
(Not) Guía, Code vB:=Delphi-SQL, ¿Cómo?
Viajar en el tiempo no es teóricamente posible, pues si lo fuera, ya estarían aqui contándonos al respecto!
Responder Con Cita
  #3  
Antiguo 23-11-2005
Avatar de MDSato
MDSato MDSato is offline
Miembro
 
Registrado: nov 2005
Posts: 17
Poder: 0
MDSato Va por buen camino
Hola vtdeleon,

Pues no, no tengo onCloseQuery en el formulario principal... Tampoco OnClose...
Responder Con Cita
  #4  
Antiguo 23-11-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Tal como lo pintas, sobre todo no teniendo nada en el evento OnCloseQuery, no veo razón alguna para que se detenga el apagado de Windows. Quizá alguna componente que tengas en tu aplicación. Creo recordar que alguna componente de tipo TrayIcon ocasionaba esto.

// Saludos
Responder Con Cita
  #5  
Antiguo 24-11-2005
Avatar de MDSato
MDSato MDSato is offline
Miembro
 
Registrado: nov 2005
Posts: 17
Poder: 0
MDSato Va por buen camino
Hola Roman...

Mi aplicación utiliza como componente para el TrayIcon el famoso RX (desconozco si se detectó algún problema al respecto). Aparte de ese no utilizo ninguno otro, aunque sí utilizo comunicaciones serie mediante una librería (no componente visual).

Esta noche se me ocurrió una posible alternativa, pero no sé si es viable... Consistiría en detectar el tipo de "apagado" que han solicitado (cerrar sesión, apagar, reiniciar) y resolicitarlo yo en mi aplicación justo antes de cerrarla (mediante un "shutdown" por ejemplo). ¿Qué os parece? Sinceramente no es lo más elegante, pero no se me ocurre nada más... :/

Muchas gracias a todos...
Responder Con Cita
  #6  
Antiguo 24-11-2005
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.043
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
por si acaso te sirve de algo puedes echar un vistazo al truco 464 de trucomanía.
Responder Con Cita
  #7  
Antiguo 24-11-2005
Avatar de MDSato
MDSato MDSato is offline
Miembro
 
Registrado: nov 2005
Posts: 17
Poder: 0
MDSato Va por buen camino
Mmmmm... Me pongo a probar ahora mismo. Me parece una buena alternativa. Voy a ver cómo se comporta y os digo algo en cuanto pueda.

Muchas gracias Casimiro
Responder Con Cita
  #8  
Antiguo 24-11-2005
Avatar de MDSato
MDSato MDSato is offline
Miembro
 
Registrado: nov 2005
Posts: 17
Poder: 0
MDSato Va por buen camino
Acabo de hacer la prueba con la solución de trucomanía, pero no consigo nada nuevo. Incluso destruyendo todas las tareas, anteriores y posteriores a la ejecución del programa. :/
Responder Con Cita
  #9  
Antiguo 24-11-2005
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.043
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
vas a tener que probar si se apaga dándole al botón y quitándole el cable de la electricidad... vaya a ser que ni así se apague


bromas aparte, es un poco raro que no consigas apagarlo de ninguna forma.
Responder Con Cita
  #10  
Antiguo 24-11-2005
Avatar de MDSato
MDSato MDSato is offline
Miembro
 
Registrado: nov 2005
Posts: 17
Poder: 0
MDSato Va por buen camino
Pues chico... Estoy por hacer la prueba, porque no lo entiendo... Ahora voy a investigar si puedo relanzar un nuevo shutdown desde mi aplicación antes de que se cierre, pero vamos... Que no tiene mucho sentido todo esto a no ser que sea lo que comentaba Roman, alguna incompatibilidad del RX... Aunque he hecho un pequeño programa de prueba y ese se cierra perfectamente y el sistema se acaba apagando...

Un misterio digno de Expediente-X...
Responder Con Cita
  #11  
Antiguo 24-11-2005
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.043
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
por cierto, creo que no lo he leido, ¿qué windows usas?
Responder Con Cita
  #12  
Antiguo 24-11-2005
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.043
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Por si te sirve de algo, este es el código que uso habitualmente para que se cierre sin problemas cuando uso un trxtrayicon

Código:
 procedure TFmain.WMQueryEndSession(var Message: TMessage); //message WM_QUERYENDSESSION;
 begin
    Message.Result := 1; // 1=s�apagar   0=no,no apagar
    canClose := True;
    //
    Halt( Message.Result );
    Close;  // no creo que llegue a este close.
    //
end;
Responder Con Cita
  #13  
Antiguo 25-11-2005
Avatar de MDSato
MDSato MDSato is offline
Miembro
 
Registrado: nov 2005
Posts: 17
Poder: 0
MDSato Va por buen camino
Hola Casimiro,

Gracias por la ayuda.
Pues he realizado la prueba en Windows 98, 2000 y XP, aunque realmente desarrollo en XP...
Esa opción que me has dado es la que estaba intentando efectuar. El problema que me encuentro ahora es que no es capaz de reconocerme ese mensaje y por tanto no pasa por el tratamiento del WM_QUERYENDSESSION, en cambio sí pasa por el WM_ENDSESSION.

Tengo la declaración en el private del formulario así:
procedure WMQueryEndSession (var Msg : TWMQueryEndSession); message WM_QueryEndSession;

y la implementación

procedure TFormMainImpre.WMQueryEndSession (var Msg : TWMQueryEndSession);
begin
Msg.Result := 1;
showmessage('ENTRO QUERY');
Close;
Halt;
end;

Pero nada. No aparece el mensaje. Seguiré intentando.

Muchas gracias de nuevo.
Responder Con Cita
  #14  
Antiguo 25-11-2005
Avatar de MDSato
MDSato MDSato is offline
Miembro
 
Registrado: nov 2005
Posts: 17
Poder: 0
MDSato Va por buen camino
Wink

Estimados colegas,

Finalmente he conseguido mi propósito y os pongo la solución que he utilizado por si alguien más se encuentra en este problema.

Utilicé la opción de Roman descrita aquí (http://www.clubdelphi.com/foros/sho...860&postcount=2) redefiniendo los mensajes de este modo:
Código Delphi [-]
procedure TFormMainImpre.WMQueryEndSession (var Msg : TWMQueryEndSession);
begin
     Msg.Result := 1;
     Close;
     Halt;
end;

procedure TFormMainImpre.WMEndSession (var Msg : TWMEndSession);
begin
     ExitWindowsEx(EWX_FORCE, 0);
     inherited;
end;
Aún no sé cual es el motivo que causa este funcionamiento, pero por las pruebas que he podido realizar si el cerrado se realizaba en el tratamiento del mensaje de Windows WMQueryEndSession, todo funcionaba perfectamente, en cambio si se realizaba en WMEndSession (como en mi opinión debería ser) mi programa se cerraba correctamente pero el apagado se detenía. El problema que me encontraba ahora es que no me llegaba el mensaje WMQueryEndSession antes que el WMEndSession, sino directamente éste último. Para ello he utilizado la instrucción que veis (ExitWindowsEx(EWX_FORCE, 0) que fuerza el cierre del programa. Es al ejecutarse esta instrucción cuando pasa por WMQueryEndSession y el cerrado y apagado son perfectos.

Muchas gracias a todos los que habéis intentado ayudarme. Habéis sido de mucha ayuda (y consuelo en la desesperación)

Saludos

Última edición por vtdeleon fecha: 25-11-2005 a las 14:12:42. Razón: Etiqueta Delphi
Responder Con Cita
  #15  
Antiguo 25-11-2005
Avatar de vtdeleon
vtdeleon vtdeleon is offline
Miembro
 
Registrado: abr 2004
Ubicación: RD & USA
Posts: 3.236
Poder: 24
vtdeleon Va por buen camino
Saludos

MDSato, trata de usar las Etiquetas vB :=Delphi-SQL
Cambie tu post anterior para que veas el cambio y lo legible que es ahora
__________________
Van Troi De León
(Not) Guía, Code vB:=Delphi-SQL, ¿Cómo?
Viajar en el tiempo no es teóricamente posible, pues si lo fuera, ya estarían aqui contándonos al respecto!
Responder Con Cita
  #16  
Antiguo 25-11-2005
Avatar de MDSato
MDSato MDSato is offline
Miembro
 
Registrado: nov 2005
Posts: 17
Poder: 0
MDSato Va por buen camino
Glups... Pues sí... Perdón por la novatada...
Responder Con Cita
  #17  
Antiguo 25-11-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Hola,

Me da la impresión de que aquí hay una confusión sobre el objetivo a realizar.

La primera pregunta sería: ¿para qué quieres manejar los mensajes WM_QUERYENDSESSION y WM_ENDSESSION?

Al parecer, la respuesta la das desde el primer mensaje:

Cita:
Empezado por MDSato
Lo que me gustaría conseguir es que cuando apaguen el sistema (esto es, CERRAR SESION, APAGAR EL SISTEMA o REINICIAR) mi aplicación se cerrara automáticamente.
Pero, sin ánimo de ofender, esto no tiene sentido. Cuando el sistema se apague, tu aplicación seguramente se cerrará, hagas lo que hagas (o no hagas).

Normalmente estos mensajes sólo los requieres para asegurarte que tu aplicación haga las rutinas de limpieza necesarias antes de terminar. Pero la más de las veces bastará con usar los eventos OnCloseQuery y OnClose del formulario principal.

De las pocas situaciones en que es necesario usar directamente los mensajes de Windows, es cuando necesitamos distinguir si el evento OnCloseQuery se genera bien porque simplemente alguien cierre la aplicación o bien porque se cierre la sesión de Windows. Y es así porque la VCL no considera esta situación.

Pero si como dijiste:

Cita:
Empezado por MDSato
no tengo onCloseQuery en el formulario principal... Tampoco OnClose
entonces no necesitas ninguna rutina de limpieza final, y por tanto, es innecesario pienso, el uso de WM_QUERYENDSESSION y WM_ENDSESSION.

Además, estos mensajes son para avisarte que tu aplicación se va a cerrar, mas no para avisarte que cierres tu aplicación. ¿Ves la diferencia? Así que usar Close, Halt o ExitWindowsEx no tendría porque ser necesario.

Dado que no haces rutinas de limpieza en el evento OnClose ni requieres el uso de OnCloseQuery, me da la impresión de que todo este hilo se originó porque por alguna razón tu aplicación estaba impidiendo que se cerrara la sesión de Windows.

La razón habría que buscarla, en lugar de andar "cuchareando" a ver con qué comando se arregla.

Si la razón está en el RxTrayIcon entonces quizá baste con desactivarlo en el evento OnClose.

// Saludos
Responder Con Cita
  #18  
Antiguo 08-11-2006
Avatar de pborges36
pborges36 pborges36 is offline
Miembro
 
Registrado: oct 2004
Ubicación: Argentina
Posts: 192
Poder: 20
pborges36 Va por buen camino
mismo problema

Hola MDSato, tengo el mismo problema y uso tambien el componente TrayIcon. Intente usar los procedimientos que mencionas pero no se exactamente como implementarlos, por el momento los tengo declarados en el TForm pero de ahi como sigue? Gracias.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 18:36:11.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi