I. Où sont les sons du système d'exploitation ?▲
L'ensemble des sons utilisés par le système peuvent être 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 stockés sur le disque, dans le sous-répertoire \media du répertoire \Windows
Les familles de sons (thèmes) sont indiquées au sein de la clé de registre :
HKEY_CURRENT_USER\
AppEvents\
Schemes\
Names
La signification (description) des sons est indiquée au sein de la clé de registre :
HKEY_CURRENT_USER\
AppEvents\
EventLabels
L'affectation ou non des sons peut être vérifiée avec la clé 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 champ nommé par regedit.exe, renseignez le champ 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 abouti, 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 ajouter 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 le 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 :
1.Créer une nouvelle application (Fichier, Nouveau Projet, Exe standard) ;
2.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) ;
3.Créer l'évènement Click() du bouton (double cliquez sur le bouton) ;
4.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 système
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 dialogue Visual Basic – les MsgBox – sont pourvus 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é !
III. L' API PlaySound, ou comment émettre n'importe quel son depuis Visual Basic ▲
Une bibliothèque de fonctions dénommée WINMM.DLL regroupe les API multimédias de Windows. Parmi ses fonctions, il y a l'API PlaySound permettant d'émettre n'importe quel son WAVE.
Nous allons :
1.Créer une nouvelle application (Fichier, Nouveau Projet, Exe Standard) ;
2.Déposer sur la fenêtre un CommandButton (double cliquez sur son icône dans l'onglet « genéral » de la Boîte à outils) ;
3.Créer l'évènement Click() du bouton (double cliquez sur le bouton) ;
4.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 appeler 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écuté : vous pouvez le lancer (en appuyant sur la touche de raccourci de l'IDE F5, par exemple).
IV. L' API SndPlaySound, ou comment émettre simplement n'importe quel son système ▲
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 :
1.Ajouter un composant ComboBox sur votre fiche ;
2.Ajouter un évènement Load() à votre Form (double cliquez dessus) ;
3.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 vue d'améliorer cet article !