Utiliser les sons du système d'exploitation avec Visual Basic

Vincent CALLIES

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. ♪

- Titre : Utiliser les sons du système d'exploitation avec Visual Basic

- Auteur : Vincent CALLIES

- Parution : 27 avril 2001

- Licence : Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2020 Vincent CALLIES. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Où sont les sons du système d'exploitation ?

- II. L'API MessageBeep ou les sons accompagnant les fenêtres de dialogue

- III. L' API PlaySound, ou comment émettre n'importe quel son depuis Visual Basic

- IV. L' API SndPlaySound, ou comment émettre simplement n'importe quel son système

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 traductionen Pascal Objet !

N'hésitez pas à me faire part de vos remarques ou suggestions en vue d'améliorer cet article !