Accueil > Windows > Comment réaliser un écran de veille Windows ?

Comment réaliser un écran de veille Windows ?

  1. Un écran de veille, qu’est ce que c’est ?
  2. Un exemple concret : Les balles rebondissantes
  3. Notes de dernière minute

On m’a souvent posé la question. Je dois moi-même avouer que j’ai longtemps cherché. Et vous-même, je suis sûr
que vous avez bataillé des heures et des heures, la preuve, vous lisez ces lignes…

L’exemple ci-dessous est en Visual Basic 5.0.

Ce langage a pour défaut d’être lent, car il est plus ou moins interprété, mais à comme grand avantage d’être simple à comprendre, même pour
un non pratiquant.
Vous pouvez télécharger la source ici :



Un écran de veille, qu’est ce que c’est ?


Vous allez rire quand je vais vous le dire si vous ne le saviez pas déjà. Les gars de chez
Microsoft ne se sont pas cassé la tête. Il ont bêtement changer l’extension EXE d’un fichier
exécutable en .SCR. Et ça suffit. C’est pas plus dur que cela. Bien sûr, après, il faut écrire
un peu de code.

Car vous l’aurez certainement remarqué, un écran de veille fonctionne de plusieurs façons :

  • Le mode Ecran de veille : C’est lorsque l’écran de veille fonctionne
    de façon normale, lorsque l’on clique sur le bouton ‘Aperçu’ ou lorsque l’on attend un
    certain temps.

  • Le mode Configuration : Ce mode permet de configurer l’écran de
    veille à l’aide de la boîte de dialogue appropriée. Quand vous cliquez sur le bouton
    ‘Configurer’ des propriétés d’affichage.

Pour lancer ces deux modes, Windows utilise la technique des arguments de commande. Vous

avez certainement fait du DOS. Lorsque vous tapez ‘DIR’, la liste des fichiers du répertoire en

cours apparaît. Maintenant, si vous tapez ‘DIR /W’, la liste des fichiers apparaît toujours, mais

en colonnes, car on a passé un argument de commande : /W.

Pour lancer le mode Ecran de veille, Windows utilise l’argument /S comme Screen Saver.

Pour le mode Configuration, c’est l’argument /C comme Config.


Un exemple concret : Les balles rebondissantes

Maintenant que la théorie a plus ou moins été détaillée, nous allons passer à un exemple pratique,

détaillé pas à pas en Visual Basic.

Allez dans Visual Basic et créez un nouveau projet ‘EXE standard’. Ajoutez à ce projet un module

et une autre feuille. Renommez le module en ‘basMain’, et les feuilles en ‘frmConfig’ et

‘frmScreensaver’. Dans la boîte de dialogue du menu ‘Projet/Propriété’, sélectionnez ‘Sub Main’

comme objet de démarrage.


Allez dans le module ‘basMain’ et créez la sub ‘Main’. Ecrivez ‘Public Sub Main’.

C’est le code situé dans cette procédure qui sera exécuté lors du démarrage. C’est donc ici

qu’il faudra traiter l’argument de la ligne de commande, soit /S, soit /C.

Pour reconnaître l’argument de commande, nous allons créer une fonction qui renverra l’argument

spécifié.

Voici le code de cette fonction :


Public Function GetArg(Arg As Integer) As String
Dim strArg() As String
Dim strCommand As String
Dim strChar As String * 1
Dim intLength As Integer
Dim intArg As Integer
Dim i
Dim j

strCommand = Command()
intLength = Len(strCommand)
For i = 1 To intLength
strChar = Mid(strCommand, i, 1)
If strChar = « / » Then
intArg = intArg + 1
ReDim Preserve strArg(1 To intArg)
strArg(intArg) = strArg(intArg) & strChar
For j = i + 1 To intLength
strChar = Mid(strCommand, j, 1)
If strChar = « / » Then
strArg(intArg) = Trim(strArg(intArg))
Exit For
End If
strArg(intArg) = strArg(intArg) & strChar
Next j
End If
Next i

If Arg <= 0 Then
GetArg = strArg(LBound(strArg))
ElseIf Arg > UBound(strArg) Then
GetArg = strArg(UBound(strArg))
Else
GetArg = strArg(Arg)
End If
End Function

Cette fonction permet de traiter facilement les arguments de commande. Il suffit de spécifier

le numéro de l’argument à retourner et le tour est joué !

Retournons maintenant à la Sub Main. Si l’argument est ‘/S’, on lance la feuille ‘frmScreensaver’.

Si c’est l’argument ‘/C’, c’est la feuille ‘frmConfig’ qui est lancée. Vous aurez remarqué que l’on

n’utilise que les 2 caractères les plus à gauche de l’argument. C’est parce que l’argument est suivi

d’un nombre que nous expliquerons dans un prochain sujet. Il faut également empêcher la création

de plusieurs instances de l’application, sinon, on va se retrouver avec une multitude d’écrans

de veille lancés en même temps, ce qui finirait par faire planter le PC.


Public Sub Main()
If App.PrevInstance = True Then End

Select Case Left(UCase(GetArg(1)), 2)
Case « /C »
frmConfig.Show
Case « /S »
frmScreensaver.Show
End Select

Do
Loop Until DoEvents = 0
End Sub

Pour tester votre écran de veille dans Visual Basic, il vous faut spécifier l’argument ‘/S’ ou

‘/C’ dans la boîte de dialogue de ‘Projet/Propriétés’.

Passons maintenant au code de l’écran de veille lui-même. Pour cela, placez-vous dans la procédure

‘Form_Load’ de la feuille ‘frmScreensaver’. Il nous faut redimensionner la fenêtre en plein

écran, faire disparaître la barre de titre et changer le fond en noir. Tout ceci doit se trouver

dans la procédure ‘Form_Load’. Vu que la propriété ‘BorderStyle’ est en lecture seule au moment

de l’exécution, vous devez la modifier dans la fenêtre ‘Propriétés’ :


Private Sub Form_Load()
With Me
.BackColor = vbBlack
.Move 0, 0, Screen.Width, Screen.Height
End With
End Sub

Comme vous le savez certainement, un écran de veille est arrêté par différents événements. Vous

devez donc décharger la feuille à l’aide du code suivant dans les procédures qui le demandent.

Le code est simple, c’est :


Private Sub Evénement()
Unload Me
End Sub

Vous devez écrire Unload Me pour les événements suivants :

  • Form_Click
  • Form_DblClick
  • Form_Deactivate
  • Form_KeyDown
  • Form_KeyPress
  • Form_KeyUp
  • Form_LostFocus
  • Form_MouseDown
  • Form_MouseMove (voir ci-dessous)
  • Form_MouseUp

Pour ‘Form_MouseMove’, il y a un petit problème. En effet, cet évènement est continuellement généré.

Il va donc falloir écrire du code pour éviter que l’écran de veille se termine même si la souris

ne bouge pas :


Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Static sngX As Single
Static sngY As Single
Static blnInit As Boolean

If blnInit = False Then
sngX = X
sngY = Y
blnInit = True
Exit Sub
End If

If sngX + 5 < X Or sngX - 5 > X Or sngY + 5 < Y Or sngY - 5 > Y Then Unload Me

End Sub

Vous pouvez tester. Déjà, ça peut faire un écran de veille. (Souvenez-vous de l’écran vide

fourni avec Windows). Mais il y a un petit détail pas net : on voit le curseur de la souris.

Vous devez donc créer un Curseur Invisible avec votre éditeur d’image favori. Chargez ce curseur

dans la propriété ‘MouseIcon’ et sélectionnez ‘99 – Custom’ dans ‘MousePointer’.

Nous allons maintenant faire rebondir nos fameuses balles… Pour cela, nous allons créer un

type pour la balle. Allez dans la partie ‘Déclararation’ du module ‘basMain’ et écrivez le code

suivant :


Option Explicit

Public Const REG_SECT_BALLES As String = « Balles »
Public Const REG_BALLES_NOMBRE As String = « Nombre »

Public Type TBalle
X As Single
Y As Single
CX As Single
CY As Single
Diam As Integer
End Type

Public Balle() As TBalle

L’Option Explicit, c’est selon que vous déclariez vos variables explicitement ou

implicitement.

Comme notre écran de veille va être un petit peu configurable, nous allons utiliser un nombre

de balles variables qui sera stocké dans la base de registre. C’est à ça que vont servir les

constantes que l’on a définies. Pour cela, nous allons créer une fonction qui renverra le nombre

de balles à utiliser :


Public Function GetNumBalles() As Integer

GetNumBalles = CInt(GetSetting(App.EXEName, REG_SECT_BALLES, REG_BALLES_NOMBRE, 1))

End Function

Allez dans la feuille ‘frmScreensaver’ est ajoutez un Timer. Renommer le en ‘tmrScreensaver’

et assignez la valeur 1 à la propriété ‘Interval’. Allez dans la procédure ‘tmrScreensaver_Timer’

et écrivez le code suivant :


Private Sub tmrScreensaver_Timer()
Static blnInit As Boolean
Dim i

If blnInit = False Then
ReDim Balle(GetNumBalles – 1)
FillStyle = vbFSSolid
For i = LBound(Balle) To UBound(Balle)
Randomize Timer
With Balle(i)
.X = Rnd * Screen.Width
.Y = Rnd * Screen.Height
.CX = Rnd * 100 * IIf(Rnd > 0.5, -1, 1)
.CY = Rnd * 100 * IIf(Rnd > 0.5, -1, 1)
.Diam = Rnd * 500
End With
Next i
blnInit = True
End If

For i = LBound(Balle) To UBound(Balle)
With Balle(i)
FillColor = BackColor
Circle (.X, .Y), .Diam, BackColor
.X = .X + .CX
.Y = .Y + .CY
FillColor = vbYellow
Circle (.X, .Y), .Diam, vbYellow
If .X – .Diam <= ScaleLeft Or .X + .Diam >= ScaleWidth Then .CX = -.CX
If .Y – .Diam <= ScaleTop Or .Y + .Diam >= ScaleHeight Then .CY = -.CY
End With
Next i
End Sub

Ca y est! Notre écran de veille est terminé! Mais il nous faut réaliser la deuxième partie de

l’écran de veille : le mode Configuration. Pour cela, allez dans la feuille ‘frmConfig’ et

assignez ‘Configuration de l’écran de veille’ à la propriété ‘Caption’ de la feuille et modifiez

la propriété ‘BorderStyle’ sur ‘3 – Fixed Dialog’

Dessinez (c’est à dire apposez) deux boutons de commande. Renommez l’un en ‘cmdOK’ et l’autre

en ‘cmdAnnuler’. Allez dans la procédure ‘cmdAnnuler_Click’ et écrivez le code suivant :


Private Sub cmdAnnuler_Click()
Unload Me
End Sub

Dessinez un Label et renommez sa propriété ‘Name’ en ‘lblExplain’ et écrivez ‘Nombre de balles :’

dans sa propriété ‘Caption’.

À coté, dessinez un contrôle TextBox et modifiez sa propriété ‘Name’ en ‘txtBalles’. Ensuite,

modifiez la propriété ‘Cancel’ sur ‘True’ et modifiez la propriété ‘Caption’ en écrivant ‘&Annuler’.

Allez dans la procédure ‘cmdOK_Click’ et écrivez le code suivant :


Private Sub cmdOK_Click()
If IsNumeric(txtBalles.Text) = False Then
MsgBox « Nommbre de balles incorrect ! », vbExclamation
Exit Sub
End If

SaveSetting App.EXEName, REG_SECT_BALLES, REG_BALLES_NOMBRE, txtBalles.Text

Unload Me
End Sub

Il faut aussi indiquer l’ancien nombre dans ce contrôle TextBox. Pour cela, placez-vous dans

la procédure ‘Form_Load’ de la feuille et écrivez :


Private Sub Form_Load()
txtBalles.Text = GetNumBalles
End Sub

Cette fois, c’est bel et bien fini. Il ne vous reste plus qu’à aller dans ‘Fichier/Créer Projet1′.

Dans le nom du fichier, changez l’extension .EXE en .SCR. Ensuite, déplacez ce fichier soit dans

le répertoire de Windows, soit dans le répertoire Système de Windows. Vous pouvez maintenant

l’utiliser comme un écran de veille standard.

Notes de dernière minute

Vous remarquerez cependant que cet écran de veille ne posséde pas d’aperçu. En effet, il

n’existe non pas deux mais trois arguments de la ligne de commande. Et ce toisième argument

(/P) sert à utiliser l’aperçu dans le petit écran de l’ordinateur du Panneau de configuration. Cet

argument est suivi d’un chiffre qui est l’handle d’un objet. Mais nous verrons prochainement

comment l’utiliser. Si vous avez des suggestions, n’hésitez pas…

Categories: Windows Tags:
  1. Laurent
    03/03/2003 à 14:15 | #1

    Je souhaite realiser moi meme un ecran de veille avec des photos,animations…
    Merci

  2. Patrick
    30/04/2004 à 09:36 | #2

    Merci, c’est très pédagogique: maintenant on sait tout des .SCR
    ou presque, on attend la suite pour le /P.
    Encore bravo.

  3. cherkaoui
    13/07/2004 à 15:24 | #3

    merci beaucoup de m’envoyer le programme

  4. VID
    08/12/2004 à 14:18 | #4

    un scr est un exe renommé? on peux le faire avec un soft pro, comme 3DGS?

  5. jojo
    10/11/2005 à 11:13 | #5

    super!… tout ce que j’attendais..

  6. hicham
    21/03/2006 à 12:07 | #6

    je souhaitez de realiser moi meme un ecran de veille qui permet de animer des phgotos et dans le même temp la music
    repond moi s’il te plais

  7. marc
    18/04/2006 à 20:54 | #7

    bonjour
    j’ai essayé quelques petits points :
    apparement il ne réagit pas aux touches du clavier, ne réagit qu’au déplacement de la souris.
    puis lorsque je veux lancer les paramètres il me lance l’écran de veille,alors que sous vb avec l’argument /c ça fonctionne!

  8. MHRSU
    03/06/2010 à 22:36 | #8

    genial merci c’est exactement ce que je cherchais

  1. Pas encore de trackbacks