Ver Mensaje Individual
  #3  
Antiguo 12-12-2006
mierda mierda is offline
Miembro
 
Registrado: may 2006
Posts: 129
Reputación: 19
mierda Va por buen camino
hola, ante todo gracias por contestar

Hola, ante todo, gracias por contestar. Tengo un messenger corporativo de la empresa, que se arranca cuando se inicia la sesion. Entonces, intento conseguir que cuando alguien cierre la sesion o apaga el ordenador, se guardan unos valores en unas tablas.

Por lo que intento capturar ese cierre de sesion o apagado, hago mis cosas y sigue cerrandose o apagandose

Código Delphi [-]
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;
type
  TForm1 = class(TForm)
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure WMQueryEndSession (var Msg: TWMQueryEndSession);
    message WM_QueryEndSession;   // esta funcion intercepta el mensaje que le lanza el windows a cerrar a la ventana de delphi
  end;
var
  Form1: TForm1;
  EndSessionFlags: integer; // esti es para q no se cierre hasta que no me de la gana
  ProcessStatus: integer;  // idem de arriba

implementation
{$R *.dfm}
{ TForm1 }
procedure TForm1.WMQueryEndSession(var Msg: TWMQueryEndSession);
begin
//showmessage (inttostr(Msg.Unused) + ' ' + inttostr(Msg.Result));
Timer1.Enabled := true;
case ProcessStatus of
    0: // Primera vez
      begin
        ProcessStatus := 1;        // Evita entrar aquí de nuevo
        EndSessionFlags := Msg.Unused;  // Guarda la forma de cierre
        Msg.Result := 0;           // Decimos a Windows que no termine
                      // realizar el proceso dentro de unos milisegundos
      end;
    1: // Estamos procesando
        Msg.Result := 0;      // Decimos a Windows que no estamos listos
    2: // Hemos terminado de realizar el proceso
      begin
        ProcessStatus := 0;   // Listo para la próxima (si corresponde)
        Msg.Result := 1;      // Estamos listos. Se puede cerrar Windows
      end;
    end;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
ProcessStatus := 2;       // Señal para indicar que hemos terminado
ExitWindowsEx(EndSessionFlags, 0);  // Cerramos Windows
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
ProcessStatus := 0;
end;
end.

Para eso intento utilizar el endsessionflags que ha capturado el mensaje que han mandado de cerrar o apagar. Pero el problema es q siempre me cierra la sesion .... nunca me apaga ... aun cambiando por "Msg.Unused".

Un saludo
Responder Con Cita