Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #21  
Antiguo 03-04-2016
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
No he tenido esa experiencia con Hooks, pero puede ser que tu app se niegue a terminar la sesión. Para resolverlo tendrás que manejar los mensajes WM_QUERYENDSESSION y WM_ENDSESSION

Suelo reescribir la función virtual WndProc del formulario para estos menesteres:
Código:
private:
  void __fastcall WndProc(Messages::TMessage &Message);
Código:
void __fastcall TForm1::WndProc(Messages::TMessage &Message)
{
  switch(Message.Msg){
    case WM_QUERYENDSESSION:
      Message.Result = 1;
      break;
    case WM_ENDSESSION:
      if(hKeyboardHook) UnhookWindowsHookEx(hKeyboardHook);
      if(hMouseHook)    UnhookWindowsHookEx(hMouseHook);
      break;
  }
  TForm::WndProc(Message);
}
Pruébalo y nos cuentas.

Saludos.
Responder Con Cita
  #22  
Antiguo 03-04-2016
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
Mañana lo probaré pero me surgen un par de dudas al ver tu código:
1. ¿que hace Message.Result=1 exactamente? Es que solo veo esa instrucción para ese evento.
2. Al apagarse windows este cierra todas las aplicaciones antes ¿usa TerminateProcess para ello? ¿al cerrarla no pasa por el evento OnClose al cerrarse?
Responder Con Cita
  #23  
Antiguo 04-04-2016
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 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
  #24  
Antiguo 04-04-2016
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
Pero si haciendo lo que haces en el primer case se supone que ya se cerrará por su vía normal se supone que ya irá al evento OnClose y allí ya me encargo de terminar los hooks ¿para que controlar el segundo evento que pones?
Responder Con Cita
  #25  
Antiguo 04-04-2016
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Cita:
Empezado por aguml Ver Mensaje
Pero si haciendo lo que haces en el primer case se supone que ya se cerrará por su vía normal se supone que ya irá al evento OnClose y allí ya me encargo de terminar los hooks ¿para que controlar el segundo evento que pones?
Porque como no puedo reproducir tu circunstancia, he querido asegurar el tiro tratando los dos mensajes y, además, es más didáctico.

PD/ He actualizado el control TSysTrayIcon

Saludos.
Responder Con Cita
  #26  
Antiguo 04-04-2016
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
¿Que le has hecho?
Responder Con Cita
  #27  
Antiguo 04-04-2016
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Cita:
Empezado por aguml Ver Mensaje
¿Que le has hecho?
Cita:
Empezado por escafandra
Me he seguido entreteniendo con este componente y he mejorado el efecto de la propiedad Hide eliminando el efecto de "insinuación" en la barra de tareas al minimizarse y he añadido los eventos que responden a los mensajes NIN_BALLOONSHOW, NIN_BALLOONHIDE, NIN_BALLOONUSERCLICK y NIN_BALLOONTIMEOUT

El componente está probado en Builder 5 y 6 y en delphi 6 y 7. Posiblemente funcione en versiones posteriores.
..
Saludos.
Responder Con Cita
  #28  
Antiguo 04-04-2016
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
¿Qué es eso del efecto insinuación?
Otra cosa, he estado haciendo pruebas para ver si con lo que me pusiste pasaba por los eventos FormClose y FormCloseQuery y he podido comprobar como cierra la aplicacion sin pasar por ninguno de esos eventos. No se como lo hará entonces.
Así lo he dejado al final:
Código PHP:
void __fastcall TFormMain::WndProc(Messages::TMessage &Message)
{
  switch(
Message.Msg){
    case 
WM_QUERYENDSESSION:
      
Message.Result 1;
      return;                        
// La VCL no podrá procesar el mensaje
    
case WM_ENDSESSION:
      
//CloseApp = true;
      //SysTrayCanClose = CloseApp;
      
if(hKeyboardHook != NULL){
         
SysTrayIcon->Minimize();
         
SysTrayIcon->ShowBalloon("Oye tu","¿Como te atreves a cerrar la sesión cuando estoy bloqueando?\nEsto no quedará así, me he quedado con tu cara");
         
Sleep(6000);
         
UnhookWindowsHookEx(hKeyboardHook);
         
hKeyboardHook NULL;
      }
      if(
hMouseHook != NULL){
         
UnhookWindowsHookEx(hMouseHook);
         
hMouseHookNULL;
      }
      break;
  }
  
TForm::WndProc(Message);

Un ultimo detalle sobre el componente, estaría muy bien el crear una propiedad que indique el tiempo que se mantendrá abierto el bocadillo para poder indicar el tiempo que queremos que se quede abierto. Eso es muy util para poner menos tiempo a mensajes cortos y mas a mensajes largos por ejemplo. ¿Es posible eso o viene un tiempo establecido que no es configurable?

Última edición por aguml fecha: 04-04-2016 a las 10:46:31.
Responder Con Cita
  #29  
Antiguo 04-04-2016
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
Otro detalle, he instalado la nueva version del componente y lo he probado con mi proyecto. En mi proyecto al dar al boton cerrar de la barra de titulo del formulario se minimiza el formulario al systray y veo que en tu ejemplo al minimizar no se produce el efecto ese que parece que se encoje el formulario hacia la barra de tareas pero en mi caso si se produce ese efecto. No se si es normal con la nueva version de tu componente o no.
Responder Con Cita
  #30  
Antiguo 08-04-2016
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
He vuelto a actualizar SysTrayIcon y le he añadido el TimeOut de notificaciones en la propiedad BalloonInterval el enlace lo tienes aquí, junto con la versión anterior

Saludos.
Responder Con Cita
  #31  
Antiguo 08-04-2016
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
Muchas gracias.
Responder Con Cita
  #32  
Antiguo 08-04-2016
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
Lo he instalado y probado y esta genial. Solo dos cosillas, el limite inferior se lo he cambiado de 5000 a 1000 y el superior lo he dejado pero 300000 me parece mucho ya que son 5 minutos. Creo que es demasiado pero nunca se sabe para que puede servir tener un bocadillo 5 minutos en pantalla jajaja.
Responder Con Cita
  #33  
Antiguo 08-04-2016
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
El problema está en que win 8 y 10 no admiten valores menores de 5000 y el límite alto es de 5 minutos. En WINXP no hay problema para establecer el límite que quieras. Es por eso que puse los límites que ves.

Saludos.
Responder Con Cita
  #34  
Antiguo 08-04-2016
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
Aaaa ok ok. De todos modos es genial.
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Bloqueador para Android FabianSiza Desarrollo en Delphi para Android 1 14-01-2015 13:22:45
teclado usb armando Varios 1 12-02-2011 04:09:00
Bloqueador solar.... RONPABLO La Taberna 5 16-07-2007 19:48:47
Teclado D-MO Linux 3 14-07-2006 21:06:07
USB Teclado en Red Hat 9 nicocer Linux 0 05-07-2004 22:04:56


La franja horaria es GMT +2. Ahora son las 04:07:01.


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