Comment réaliser un économiseur d’écran
avec delphi
 
 

Présentation :
Réaliser un économiseur d’écran pour windows, consiste simplement
à réaliser un programme exécutable.
 
Aucune gestion d’activation, aucun timer pour savoir depuis combien de
temps l’utilisateur n’a pas bougé sa souris ou pressé une touche ne sont
nécessaire. Windows se charge de tout, et démarre notre économiseur
d’écran en temps voulu.
 
De la même manière, lorsque notre économiseur se ferme parce qu’un
utilisateur a effectué une action (ex : touche pressé..), Windows restitue
l’écran exactement comme il le fait avec un programme normal.
 
Afin de remplir son rôle d’économiseur, le comportement du programme
que l’on crée doit tout de même remplir quelques conditions telles que
s’exécuter au premier plan, faire évoluer régulièrement la couleur de chaque
point de l’écran et se fermer dès que l’utilisateur exécute une action sur le
clavier ou la souris.
 
Transformer l’exécutable en économiseur :
Les économiseurs d’écrans sont donc des fichiers exécutables ayant pour
extension SCR. Apparemment, sous windows NT4, il suffit de renommer
notre exécutable en .scr, pour qu’il soit reconnu en temps qu’économiseur
d’écran. Sous windows95 et windows 3.x, il faut en outre ajouter une partie
description à l’en-tête du fichier, l’ajout fonctionnant également sous NT.
 
En utilisant Delphi, il y a deux façons d’ajouter cette description à l’exécutable
produit.
 
On peut utiliser la directive {$D .. que l’on place dans le fichier source du projet
(.dpr).
 
Ex :

program Project1;
 
uses
Unit1 in 'Unit1.pas' {Form1};
 
{$R *.RES}
{$D mon économiseur}
 
var n : integer;
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
On peut également obtenir le même résultat en renseignant le champs descritpion
dans le menu : project/options/linker :
 

 
 
 
Les paramètres passés par windows :
A ce stade, on a un économiseur d’écran. Toutefois, si une fois avoir placé notre
programme dans le répertoire windows on sélectionne dans la liste notre économiseur,
on risque de voir notre programme démarrer plusieurs fois. En fait, selon les choix
de l’utilisateur dans la fenêtre des économiseurs d’écrans, windows lance
notre programme avec différents paramètres.
 

Lorsque l’utilisateur sélectionne un économiseur dans la liste, windows le lance
en lui passant deux paramètres : /p et un numéro de handle correspondant au handle
de la zone de preview miniature (écran ci dessus).
 
Lorsque l’utilisateur sélectionne settings (paramètres), windows lance l’économiseur en lui
passant en paramètres /c:xxxx dans le cas de NT et /c dans le cas de windows95 et
windows 3.x.
 
Lorsque l’utilisateur sélectionne preview (aperçu) windows lance l’économiseur en lui
passant /s .
 
En cours d’exécution, windows lance l’économiseur avec ce même
paramêtre /s.
 
 
 
 

Exemple :
----------------- Project1.dpr -----------------
uses
  Forms,
  dialogs,
  windows,
  messages,
  sysUtils,
  Unit1 in 'Unit1.pas' {screenSaver};

{$R *.RES}
{$D mon économiseur}


procedure RunApplication;
begin
  repeat
    application.HandleMessage;
  until Application.Terminated;
end;

begin
  if (paramCount > 0) and
     (pos('c', lowerCase(paramStr(1))) > 0) then
    showMessage('Pas de paramètres')
  else
  if (paramCount > 0) and
     (pos('s', lowerCase(paramStr(1))) > 0) then
  begin
    Application.Initialize;
    screenSaver := TScreenSaver.create(application);
    screenSaver.show;
    RunApplication;
  end;
end.


------------------ unit1.pas -----------------
interface
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

type
  TscreenSaver = class(TForm)
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure FormCreate(Sender: TObject);
  private
    FXMouse : integer;
    FYmouse : integer;
  public
    //--
  end;

var
  screenSaver: TscreenSaver;

implementation

{$R *.DFM}
//----------------
//--    kernel  --
//----------------
procedure TscreenSaver.FormCreate(Sender: TObject);
begin
  FXMouse := 0;
  FYmouse := 0;
  //-- do wat you want
end;

//----------------
//--    sortie  --
//----------------
procedure TscreenSaver.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  application.terminate;
end;

procedure TscreenSaver.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Application.Terminate;
end;

procedure TscreenSaver.FormMouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
begin
  if (FXMouse + FYmouse <> 0) and
     (((FXMouse - X)>5) or
      ((FYMouse - Y)>5)) then
    application.terminate
  else
  begin
    FXMouse := X;
    FYMouse := Y;
  end;
end;

end.