PDA

Ver la Versión Completa : Detectar paso a inactividad


oworty
05-11-2004, 16:28:57
Hola a todos.

Estoy interesado en realizar una aplicacion que este residente en memoria y que lance un proceso justo cuando el ordenador lance el protector de pantalla, o se ponga en modo suspension o en modo hibernación, pero no he conseguido averiar que evento hay que capturar para lanzar este proceso. Si en el caso de que no existiese tal evento, saber si existe alguna función de la API windows que me diga si esta el protector de pantalla esta en marcha o el modo de suspensión o el de hibernacion.
Me seria de gran utilidad si alguien me pudiese orientarme un poco, puesto que soy un pollo en el mundo de la api de windows.

Ante todo muchas gracias a todos!

bumiga
05-11-2004, 20:24:15
Espero que el siguiente codigo te sirva, no es mio, lo baje de Internet, pero no me acuerdo de donde y por eso no puedo colocar los creditos a la(s) persona(s) que lo publicaron, mis disculpas


Unit DetecIdleMain

interface

uses
windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, ComCtrls

type
TDetectIdleForm = Class(TForm)
IdleTimer: TTimer;
StatusBar1: TStatusBar;
procedure FormCreate(Sender: TObject);
procedure ResetInactive(var Msg: TMsg; var Handled: Boolean);
procedure IdleTimerTimer(Sender: TObject);
private
fLastActive: TDateTime;
systemInactive: Boolean;
public
end;

var
DetecIdleForm: TDetecIdleForm;

implementation

{$R *.dfm}
procedure TDetectIdleForm.IdleTimerTimer(Sender: TObject);
begin
if ((fLastActive + EncodeTime(0,0,30,0)) < Now) then
begin
systemInactive := False;
IdleTimer.Enable := False;
end;
end;

procedure TDetectIdleForm.FormCreate(Sender: TObject);
begin
Application.OnMessage := ResetInactive;
end;

procedure TDetectIdleForm.ResetInactive(var Msg: TMsg; var Handled: Boolean);
begin
if (Msg.message = WM_SYSCOMMAND) then
if (msg.wParam = SC_SCREENSAVE) then
if (not systemInactive) then
begin
//Do something... User is inactive
StatusBar1.Panels[0].text := TimeToStr(Now);
IdelTimer.Enable := True;
end;
SystemInactive := True;
fLastActive := Now;
end;

end.

oworty
07-11-2004, 14:22:17
Ante todo muchas gracias por la información que me has dado, me ha sido de gran ayuda. Pero he encontrado un pequeño problema, verás funciona perfectamente siempre y cuando este el programa en primer plano, pero si el programa no esta en primer plano(esta minimizado) el programa no captura el evento, carga el protector de pantalla y no se ejecuta el proceso que yo he programado.

Gracias de nuevo!!!