ScreenSaver

 

 

Avant propos

Un ScreenSaver est en fait un simple programme executable de type windows application (.exe) que renommé en .scr.

Ce que l'on peut constater à l'utilisation d'un ScreenSaver:

- Au bout d'un certain temps, le screenSaver est lancé par le système

- Et qu'il est possible pour l'utilisateur de lancer un écran de paramétrages du ScreenSaver.

...En autre...

 

Or, le système ne connait qu'un seul programme, le .scr qui a été choisi par l'utilisateur. Cela signifie donc que votre programme doit être capable de savoir qu'il doit faire son travail de ScreenSaver ou bien que l'utilisateur veut le paramétrer.

 

Voici une première approche du ScreenSaver pour expliquer son fonctionnement.

Il faut savoir qu'il existe une autre solution qui est basée sur la première méthode, mais qui est aussi "plus simple" à développer, puisque pas mal de choses seront automatisées.

 

Première approche - Détaillée et non officielle -

Pour que votre programme sache ce que l'on veut de lui, le système devra lui passer des informations. La méthode la plus simple étant de passer ces informations dans la ligne de commandes du programme, sachant qu'un ScreenSaver n'est jamais laissé en mémoire, il est toujours rechargé si nécessaire (par exemple pour passer en mise en veille ou pour paramétrer la mise en veille).

Les paramètres pouvant être passés seront les suivants:

Valeur(s) Désignation
s ScreenSaver - Demande l'activation du screen saver - Le système lance la mise en veille
' ' ou c Configuration - Demande le paramétrage du screen saver
a Changement du mot de passe
p Preview

Cf. WinMain pour récupérer ces paramètres...

L'option 'a' n'est plus utilisée sous Windows NT ou XP. C'est en effet Windows qui va gérer cette partie.

Image non trouvée !Dans le mode preview, le preview se fait généralement dans une image représentant un moniteur...

Windows va en fait créer une fenêtre dans ce petit moniteur. Vous n'aurez donc pas besoin dans créer une nouvelle. Par contre, il faut récupérer le handle de cette fenêtre pour travailller dedans. Ce paramètre commence à la troisième position de la ligne de commande. Il s'agira d'une chaîne de caractères, il faudra donc convertir cette chaîne en un handle !

Par exemple:

 

Image non trouvée !Dans le cas de l'activation de la mise en veille, il faudra créer une fenêtre en plein écran (Voir chapitre directX, fenêtre en plein écran, attention, la création d'une fenêtre en plein écran n'a rien à voir avec DirectX, il faut ensuite informer DirectX si vous l'utilisez)), mais aussi pouvoir quitter le screen saver par exemple lors de l'activation de Alt-Tab, d'un déplacement de la souris ou encore de l'appui sur une touche du clavier. Mais tout cela dépendra de ce que vous voulez faire...

 

Voici un exemple très très simplifié:

Ce screen saver va afficher les paramètres envoyés par Windows.

Ce screen saver n'aura vraiment rien de bien joli, puisqu'il se contentera d'afficher "coucou"...

Pour quitter, il suffira de cliquer sur la case de fermeture de la fenêtre qui ne sera d'ailleurs même pas en plein écran...

Compiler le programme puis renommez le en .scr.

Il faudra ensuite recopier le programme dans le bon répertoire...Comme il change s'en arrêt suivant les versions de Windows, utilisez un explorateur Windows et chercher les *.scr dans le répertoire d'installation de Windows !

Sous XP, si votre réperoire d'installation et windows, allez dans windows\system32.

Image non trouvée !

 

Seconde approche, l'officielle celle-ci

Le développement d'un screen-saver de manière officielle est au départ identique, il faut se créer une projet Win 32 application.

On passera par une librairie pour gérer le screensaver:

Sous Microsoft C++

La librairie sous Microsoft est SCRNSAVE.LIB

Il faudra ajouter dans le menu projet\settings choisir l'onglet link et Object/library modules : SCRNSAVE.LIB

Sous Dev-C++

La librairie sous Dev-C++ est libscrnsave.a

- Dans le menu Project Options, et dans : Further object files or linker options..., il faut ajoutez -lscrnsave

- Dans le menu projet\option du projet et l'onglet paramétrer, ajouter les fichiers lib/libscrnsave.a

 

L'include

Que ce soit Micosoft ou DEV-C++, l'include sera dans les deux cas scrnsave.h.

Image non trouvée !Pour pouvoir utiliser cet include, il faudra avoir déclaré avant celui-ci:

#include <windows.h>

 

Si vous regardez bien le code précédent, vous pouvez vite deviner ce qui se passe...

Le code WinMain ne sera plus à faire, c'est en effet à la librairie de récupérer la ligne de commandes et de lancer le code correspondant à l'option passée.

De même, vous n'aurez pas à gérer la fenêtre ou le fait d'arrêter la mise en veille par le déplacement de la souris ou appuie sur une touche du clavier (du moins par défaut).

Par contre, il faudra quand même avoir du code pour le paramétrage de l'écran de veille ou du code pour afficher ce qu'i faut dans la fenêtre suite au passage en mise en veille.

Il y a d'autres petites choses à faire, mais ce n'est pas bien difficiles:

Tout d'abord, il faut savoir que le gestionnaire d'écrans de veille aura besoin d'afficher un titre dans la liste des écrans de veille disponibles.

Pour celà, vous allez devoir créer un fichier ressource avec une chaîne de description (string table) commençant par 1 et se nommant IDS_DESCRIPTION.

Marche à suivre:

Sous Microsoft: Insert\Resource, sélectionnez string table puis New.

Une fenêtre avec un tableau (ID-Value et Caption) s'affiche avec rien dedans...

Dans le menu View, sélectionnez resource symbols puis New

Tapez IDS_DESCRIPTION avec la valeur 1.

Puis dans le tableau précédent, clique droit et choisissez "New String"

Sélectionnez IDS_DESCRIPTION et saisissez le titre de votre screen-saver.

Image non trouvée !Le contenu de cette chaîne ne doit pas dépasser 25 caractères !

 

De la même manière, le screen saver pourra afficher une icône dans l'explorateur. Pour définir cette icône, il faudra créer (toujours dans le fichier de ressource) une icône ID_APP avec la valeur 100 (définis ainsi dans le fichier scrnsave.h).

 

La procédure de messages:

Par défaut, la librairie gérera la procédure de message de la fenêtre. Heureusement, il vous sera possible d'intervenir sur certains messages. En effet, cette procédure de message de la fenêtre va déclencher un appel à la fonction suivante:LRESULT WINAPI ScreenSaverProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam).

Vous devrez donc déclarer cette fonction qui sera appelée évidement lors d'un déclenchement de la mise en veille, mais aussi dans le tout petit moniteur lors de la sélection d'un écran de veille. Il sera donc indispensable de récupérer la taille de la zone cliente pour faire un affichage correcte.

Voici un exemple qui sera à compléter !

Tout ceci ressemble fort à la gestion des messages...

 

La dialogue de configuration:

Il est possible de créer une boîte de dialogue pour paramétrer votre ScreenSaver.

Vous utiliserez l'éditeur de ressources pour dessiner la dialog box. Il faut savoir que la librairie va essayer de lancer la dialogue qui a un identifiant nommé DLG_SCRNSAVECONFIGURE et qui doit avoir la valeur 2003.

Il faudra suivre la même démarche qu'expliquée auparavent, mais avec une dialogue à la place du string table...

Bien évidemment, il faudra une procédure pour gérer les messages de la boîte de dialogue. Elle devra se nommer ScreenSaverConfigureDialog()

 

Register

Cette fonction va servir à enregistrer des classes de fenêtres (comme des contrôles enfants). Si vous n'avez rien de spécial à y mettre (souvent le cas) faite simplement ceci:


 

Dernier Point

Il est indiqué dans l'include scrnsaver.h qu'il est nécessaire d'avoir la variable szAppName déclarée en global et contenant le nom de l'application...

Donc:

Création de la variable:

char szAppName[40] = "Mon screen-Saver";

 

Exemple

Le codeImage non trouvée !, la ressource Image non trouvée !et l'include qui va avecImage non trouvée !, enfin l'icôneImage non trouvée !

Comme dans le premier exemple, on se contentera d'afficher un "coucou" à l'écran (toujours pour ne pas surcharger le code qui doit rester simple à lire !). Il n'y a pas de timer et l'écran n'est pas effacé. Pour effectuer des opérations graphiques, voir le chapitre sur le GDI.

 

Un exemple un peu plus complet avec OpenGL est disponible ici.