Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > API de Windows
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 26-10-2004
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
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
  #2  
Antiguo 26-10-2004
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.070
Poder: 32
jhonny Va camino a la famajhonny Va camino a la fama
Caramba, a mi me sucedio alguna ves con una aplicación parecida, trate y trate de escuchar el mensaje WM_DESTROY y estaba muy confundido, tambien con WM_CLOSE, pero la verdad esque nunca trate de hacerlo con el WM_QUERYENDSESSION gracias roman haz sacado una espina que tenia desde hace algun tiempo y que de hecho trate de preguntar pero estaba tan embolatado con el asunto que nunca pude formular bien la pregunta.
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/
Responder Con Cita
  #3  
Antiguo 26-10-2004
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
Si gustas revisa este enlace en donde doy algunos detalles más de WM_QUERYENDSESSION y WM_ENDSESSION.

// Saludos
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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 05:40:38.


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