Ver Mensaje Individual
  #9  
Antiguo 26-10-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Reputación: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por ramonibk
Vereis que al fina pongo la variable DoClose a True. esto es por que me encontre con el problema que al intentar cerrar el PC si la aplicacion se encuentra con el DoClose:=False no me permite cerrar el PC

y despues en el OnShow del Form lo ponfo de nuevo a false.
Buena observación aunque tu enfoque implica que la sesión de Windows no podrá cerrarse a menos que tu aplicación esté oculta.

Este "problema" con el cierre de sesión de Windows es, desde mi punto de vista, un problema que siempre ha estado presente en Delphi y Borland simplemente no ha querido modificarlo.

El punto es que cuando el usuario intenta cerrar la sesión de Windows, el sistema manda un mensaje WM_QUERYENDSESSION a todas las aplicaciones y la VCL traduce este mensaje igual que si fuera un WM_CLOSE (cerrar la ventana) de manera que no podemos distinguir si la petción de cerrar la ventana es porque se intenta cerrar la aplicación o porque se intenta cerrar la sesión de Windows.

La manera de solucionar esto es creando un manejador para el mensaje WM_QUERYENDSESSION:

Código Delphi [-]
type
  TForm1 = class(TForm)
  private
    procedure WMQueryEndSession(var Msg: TWMQueryEndSession);
  end;

en donde indiquemos en alguna variable que se está terminando la sesión de Windows para que en OnCloseQuery podamos detectarlo (quizá la misma variable DoClose).

Pero hay que tener cuidado en que el mensaje WM_QUERYENDSESSION puede cancelarse si alguna aplicación se niega a terminar (por ejemplo un editor con archivos sin guardar donde el usuario decida cancelar el cierre). Para ello hay también que implementar un maejador para el mensaje WM_ENDSESSION y verificar que la sesión realmente se termina examinando el valor de Msg.EndSession.

// Saludos
Responder Con Cita