Detectar inactividad en el sistema

Aquí os dejo un programa que he realizado para apagar la pantalla del ordenador cuando se detecte inactividad a nivel del sistema.
Para ello he utilizado la función GetLastInputInfo presente en el WinAPI desde Windows 2000 que devuelve el tiempo desde el último evento de entrada en el sistema en la sesión del usuario actual.
El siguiente código arranca un tTimer al inicio y cuando detecta que el usuario no ha tecleado nada y tampoco ha movido el ratón procede a apagar la pantalla pasados 10 segundos.
UNIT Unit1;

INTERFACE

USES
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;

TYPE
TForm1 = CLASS(TForm)
Button1: TButton;
Timer1: TTimer;
Label1: TLabel;
PROCEDURE Timer1Timer(Sender: TObject);
PROCEDURE FormCreate(Sender: TObject);
PROCEDURE FormDestroy(Sender: TObject);
PRIVATE
{ Private declarations }
PUBLIC
{ Public declarations }
END;

VAR
Form1: TForm1;
MonitorApagado: boolean;

IMPLEMENTATION

{$R *.dfm}

//Función que detecta la inactividad del sistema
FUNCTION SecondsIdle: DWord;
VAR
liInfo: TLastInputInfo;
BEGIN
liInfo.cbSize := SizeOf(TLastInputInfo);
GetLastInputInfo(liInfo);
Result := (GetTickCount - liInfo.dwTime) DIV 1000;
END;

PROCEDURE apagarMonitor;
BEGIN
SendMessage(Application.Handle, WM_SYSCOMMAND, SC_MONITORPOWER, 1);
END;

PROCEDURE TForm1.Timer1Timer(Sender: TObject);
VAR
segundos: integer;
BEGIN
segundos := SecondsIdle;
label1.Caption := IntTostr(segundos);
IF segundos > 10 THEN
BEGIN
IF NOT MonitorApagado THEN
BEGIN
ApagarMonitor;
MonitorApagado := true;
END;
END;
END;

PROCEDURE TForm1.FormCreate(Sender: TObject);
BEGIN
MonitorApagado := false;
timer1.enabled := true;
END;

PROCEDURE TForm1.FormDestroy(Sender: TObject);
BEGIN
timer1.enabled := false;
END;

END.

Relacionados:
wake on lan 
Apagar monitor pulsando una tecla
Apagar servidor de red cuando se apaguen los terminales

No hay comentarios:

Publicar un comentario