Ver Mensaje Individual
  #23  
Antiguo 04-04-2016
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Reputación: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Cita:
Empezado por aguml Ver Mensaje
1. ¿que hace Message.Result=1 exactamente? Es que solo veo esa instrucción para ese evento.
Si una aplicación devuelve 0 al procesar WM_QUERYENDSESSION, se deniega a Windows la petición de cerrar la sesión, y ésta no se cerrará.
Cita:
Empezado por aguml Ver Mensaje
2. Al apagarse windows este cierra todas las aplicaciones antes ¿usa TerminateProcess para ello? ¿al cerrarla no pasa por el evento OnClose al cerrarse?
Windows no usa TerminateProcess, eso cierra a lo bruto una app sin esperar a que termine por medios naturales. Eso es lo que usa el administrador de tareas.
Cuando windows pide que una sesión se cierre porque se va a cerrar la sesión, lo hace a través de WM_QUERYENDSESSION, si las aplicación responde con un número distinto de 0, entonces envía WM_ENDSESSION. La respuesta a ese mensaje debería hacer cerrar la app por su vía natural.

Por algún motivo tu app se niega a cerrarse en el mensaje WM_QUERYENDSESSION y WM_ENDSESSION no es enviado o no está siendo bien tratado. Estas circunstancias no deberían aparecer en una app VCL, pero al parecer te ha sucedido. Es por eso que te propongo que tu mismo trates esos mensajes.

Ahora que te escribo estas líneas, cambia el tratamiento de mensajes por este otro, para forzar la respuesta de WM_QUERYENDSESSION:
Código:
void __fastcall TForm1::WndProc(Messages::TMessage &Message)
{
  switch(Message.Msg){
    case WM_QUERYENDSESSION:
      Message.Result = 1;
      return;                        // La VCL no podrá procesar el mensaje
    case WM_ENDSESSION:
      if(hKeyboardHook) UnhookWindowsHookEx(hKeyboardHook);
      if(hMouseHook)    UnhookWindowsHookEx(hMouseHook);
      break;
  }
  TForm::WndProc(Message);
}
Saludos.
Responder Con Cita