Utiliser les sons du
système d'exploitation avec Visual Basic
Le 27 avril 2001
Le système d'exploitation utilise un
nombre impressionnant de sons qu'il peut être utile ou amusant
d'intégrer dans une application Visual Basic. Cela économise de
la place (les sons ne sont pas à distribuer avec l'application), cela
permet d'avoir une interface complète (c'est-à-dire aussi bien
graphique que sonore). Le présent article pour propose de le faire sans
avoir recours à un OCX.
I°) Où sont les sons du système
d'exploitation ?
L'ensemble des sons utilisés par le système
peuvent choisis depuis le Panneau de configuration : la
boîte de dialogue Propriétés de sons vous
permet d'associer un son à un évènement du système
d'exploitation. Cette boîte de dialogue inscrit votre choix dans le
Registre de Windows. Il vous est déconseillé de les modifier
directement par l'éditeur du registre. Les sons sont
stocker sur le disque, dans le sous répertoire \media
du répertoire \Windows
Les familles de sons (thèmes) sont
indiquée au sein de le clé de registre :
HKEY_CURRENT_USER\AppEvents\Schemes\Names
La signification (description) des sons est indiquée au
sein de le clé de registre :
HKEY_CURRENT_USER\AppEvents\EventLabels
L'affectation ou non des sons peut être
vérifiée avec la clés suivante :
HKEY_CURRENT_USER\AppEvents\Schemes\Apps\.Default
Bien évidemment, ces informations peuvent varier quelque
peu d'un système d'exploitation à l'autre, tout du moins je
l'imagine. Aussi, le cas échéant, je vous invite à
me
contacter pour m'aider à compléter cette partie de l'article.
Note : Voici
les façons d'accéder à l'éditeur de
registre et à la boîte de dialogue
Propriétés de sons :
- RegEdit.exe est une application très commode qui vous permet
d'éditer et de modifier la base de registre Windows. Elle est
présente sur tous les systèmes (W95-98,2000,NT). Afin d'y
accéder rapidement il peut être utile de mettre un raccourci sur
le Bureau. Pour ce faire allez sur le bureau, faites un double clic!
sur l'icône Poste de travail, faites Ctrl-F, renseignez
le champs nommé par regedit.exe, renseignez le
champs Rechercher dans par le chemin
de votre répertoire Windows (généralement
C:\WINDOWS), cliquez sur le bouton Recherche
maintenant. Faites un clic! du bouton droit de la souris sur
le fichier RegEdit sur laquelle la recherche a aboutie, choisissez dans le
PopUpMenu l'option Envoyer vers... Bureau (créer un
raccourci).
- Pour accéder à la boîte de dialogue
Propriétés de sons cliquez sur
Démarrer, pointez sur Paramètres, cliquez sur
Panneau de configuration, puis double-cliquez sur Sons.
II°) L'API MessageBeep ou les sons accompagnant les
fenêtres de dialogue :
L'API MessageBeep permet d'émettre un son
système. Pour déclarer cette procédure DLL, nous allons
ajoutez une instruction Declare à la section Déclarations de la
fenêtre de code. La procédure renvoyant une valeur, nous la
déclarerons comme Function.
Private Declare Function MessageBeep& Lib
"user32.dll" _
(ByVal dwFlags As
Long)
Il faudra ensuite déclarer les constantes nécessaires à
l'utilisation de cette API.
Les voici :
Constantes
|
Contexte
|
Correspondance pour l'argument
buttons de l'instruction MsgBox
|
&HFFFFFFFF
|
Message
sonore basic généré par l'haut-parleur de votre PC.
|
|
&H40
|
SystemAsterisk - Message d'information.
|
vbInformation - Une boîte de
dialogue ayant pour icône un "i"
bleu.
|
&H30
|
SystemExclamation - Message d'avertissement
|
vbExclamation - Une boîte de dialogue ayant pour icône un signe point
d'exclamation jaune.
|
&H10
|
SystemHand -
Message d'Erreur (interruption d'un processus)
|
vbCritical - Une boîte de
dialogue contenant un signe de stop rouge.
|
&H20
|
SystemQuestion - Message demandant une confirmation ou une
infirmation.
|
vbQuestion - Une
boîte de dialogue ayant pour icône un
point d'interrogation vert. |
&H0
|
SystemDefault - Message sonore par défaut.
|
|
Nous avons donc accès par cette API à l'ensemble
des sons utilisés dans le cadre de la gestion de fenêtre Modale.
On observera la concordance de ces sons avec l'argument buttons
de l'instruction MsgBox qui permet non seulement de définir les boutons
nécessaires lors de l'affichage d'une boîte de dialogue mais aussi
la "modalité du message", c'est à dire son contexte
(une question, une erreur...) décrivant les types d'une boîte de
dialogue de message. Malheureusement cette instruction est indifférente
au contexte et émet le même son. Si nécessaire, il
conviendra donc de créer sa propre boîte de dialogue sonore. L'API
MessageBox le permet.
Pour réaliser une application de test, nous
allons :
-
Créer une nouvelle application (Fichier, Nouveau
Projet, Exe standard).
-
Déposer sur la fenêtre un CommandButton
(Double cliquez sur son icône dans l'onglet
"général" de la Boîte à outils)
-
Créer l'évènement Click() du bouton
(Double cliquez sur le bouton)
-
Copier les routines ci-dessous
Dans la section Déclarations :
Private Declare
Function MessageBeep& Lib "user32.dll" _
(ByVal dwFlags As
Long) 'déclaration de l'API relative aux sons systeme
Private Declare Function
MessageBoxA& Lib "user32.dll" _
(ByVal MyFormhWnd As
Long, ByVal lpszText As String, _
ByVal lpszCaption As
String, ByVal dwFlags As Long)
Puis, dans le module click :
Private Sub
Command1_Click()
MessageBeep (vbExclamation)
If MessageBoxA(Form1.hWnd,
"blabla", "titre", vbExclamation) = 0 Then
MsgBox "Erreur rencontrée au
cours de la tentative d'affichage" _
& " de la boite de dialogue, il n'y a pas assez de
mémoire.", vbExclamation, "Programme de test son"
End If
End Sub
Il peut-être intéressant d'accéder aux sons
utilisés dans une autre cadre que celui des fenêtres de dialogue,
tels que ceux caractérisant la réduction d'une fenêtre, le
démarrage d'un programme, la notification d'un e-mail ou l'arrêt
de Windows... La simple API MessageBeep devient alors insuffisante.
Pour aller plus
loin... Comme nous venons de le voir, les messages de dialogues
Visual Basic - les MsgBox - sont pourvu d'un accompagnement sonore
pauvre. Il est très simple, maintenant que vous maîtrisez
l'utilisation de l'API MessageBeep de créer une fonction ou un OCX
proposant cette fonctionnalité !
II°) L' API PlaySound, ou comment émettre
n'importe quel son depuis Visual Basic ?
Une bibliothèque ou librairie de fonctions
dénommée WINMM.DLL regroupe les API multimédia de Windows.
Parmi ses fonctions, il y a l'API PlaySound permettant d'émettre
n'importe quel son WAVE.
Nous allons :
-
Créer une nouvelle application (Fichier, Nouveau
Projet, Exe Standard).
-
Déposer sur la fenêtre un CommandButton
(Double cliquez sur son icône dans l'onglet "genéral" de
la Boîte à outils)
-
Créer l'évènement Click() du bouton
(Double cliquez sur le bouton)
-
Copier les routines ci-dessous :
Dans la section Déclarations :
Private Declare Function
PlaySound& Lib "winmm.dll" _
(ByVal lpszName As
String, ByVal hModule As Long, _
ByVal dwFlags As
Long)
Const SND_ASYNC = &H1 'constante indiquant que le fichier doit être jouer de
façon
' Asynchrone, c'est-à-dire permettre à votre programme de
'continuer son exécution sans attendre la fin de la lecture du
'fichier son.
Const MonFichier =
"c:/WINDOWS/MEDIA/logoff.wav" 'vous
pouvez appeller le fichier que vous souhaitez
Puis, dans le module click :
Private Sub Command1_Click()
If PlaySound(MonFichier, 0&, SND_ASYNC) =
False Then
MsgBox "Erreur rencontrée au
cours de la tentative de lecture" _
& " du fichier son, il n'est sans doute pas accessible.",
vbExclamation, "Programme de test son"
End If
End Sub
Dès lors, notre projet peut être exécuter :
Vous pouvez le lancer (en appuyant sur la touche de raccourci de l'IDE F5, par
exemple).
III°) L' API SndPlaySound, ou comment
émettre simplement n'importe quel son systeme ?
La fonction sndPlaySound permet de lire un fichier WAVE qui est
indiqué à la fonction soit par son chemin d'accès soit par
une clef du registre. Il est à noter que la Fonction PlaySound le permet
aussi mais gère inutilement plusieurs paramètres.
Nous allons modifier notre projet comme il suit pour
utiliser cette nouvelle API:
-
Ajouter un composant ComboBox sur votre fiche;
-
Ajouter un évènement Load() à votre
Form (double cliquez dessus);
-
Modifier l'évènement Click du CommandButton
en copiant les routines
ci-dessous :
Dans la section Déclarations :
Private Declare
Function sndPlaySoundA& Lib "winmm.dll" _
(ByVal lpszName As
String, ByVal hModule As Long)
Puis, dans le module Load :
Private Sub
Form_Load()
With Combo1
.AddItem (".Default")
.AddItem ("AppGPFault")
.AddItem ("CCSelect")
.AddItem ("Close")
.AddItem ("EmptyRecycleBin")
.AddItem ("MailBeep")
.AddItem ("Maximize")
.AddItem ("MenuCommand")
.AddItem ("MenuPopup")
.AddItem ("Minimize")
.AddItem ("NMain-MouseClick")
.AddItem ("NMain-MouseLeave")
.AddItem ("NMain-MouseOver")
.AddItem ("Open")
.AddItem ("RestoreDown")
.AddItem ("RestoreUp")
.AddItem ("ShowBand")
.AddItem ("SystemAsterisk")
.AddItem ("SystemExclamation")
.AddItem ("SystemExit")
.AddItem ("SystemHand")
.AddItem ("SystemQuestion")
.AddItem ("SystemStart")
.ListIndex = 1 ' Affiche le premier
élément de la liste.
End With
End Sub
Puis, dans le module click :
Private Sub
Command1_Click()
If
sndPlaySoundA(Combo1.List(Combo1.ListIndex), SND_ASYNC) = False
Then
MsgBox "Erreur rencontrée au
cours de la tentative de lecture" _
& " du fichier son, il n'est sans doute pas accessible.",
vbExclamation, "Programme de test son"
End If
End Sub
Note : le
gestionnaire d'erreur n'est pas utile. En effet, si l'utilisateur n'a pas
affecté de son pour un évènement, il me semble inutile de
le lui infliger dans votre application. Tout du moins, me semble-t-il, non
?
Pour aller plus
loin... L'astuce présente existe aussi en Delphi, un
langage de programmation orienté objet. Aussi, si vous voulez
découvrir ce puissant langage, n'hésitez pas à aller voir
sa traduction
en Pascal Objet !
N'hésitez pas à me faire part de vos remarques
ou suggestions en vu d'améliorer cet article !
Vincent CALLIES
|