Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Detectar paso a inactividad (https://www.clubdelphi.com/foros/showthread.php?t=15817)

oworty 05-11-2004 16:28:57

Detectar paso a inactividad
 
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

Código:

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!!!


La franja horaria es GMT +2. Ahora son las 21:31:22.

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