Mon métier, de par sa nature pour le moins indéfinie, m’oblige à courir assez souvent de mon bureau vers celui de collègues, qui ont pris l’habitude de balancer à travers ledit bureau quelques gimmicks trouvés sur YouTube.
Parmi ceux-ci, celui qui fait fureur depuis quelques jours, est la phrase d’une vieille dame pour le moins de mauvais poil, immortalisée dans cette vidéo :
Forcément, s’agissant d’un bureau d’informaticiens, le terme « planté » (à 5:09 – mais démarrez à 5:04) est très significatif. Et fréquemment usité.
J’ai donc eu l’idée de leur proposer de faire un petit sampler, afin qu’ils puissent s’échanger quelques sons / mots / phrases à longueur de journée. Pour cela, j’ai commis un petit script PowerShell tout simple, mais ô combien efficace.
Les pré-requis
– PowerShell (perso, j’utilise la V5. Ça peut peut-être marcher avec une version antérieure, j’en sais rien, je n’ai pas essayé)
– Savoir faire la distinction entre abscisses et ordonnées (c’est du niveau 6ème, je pense)
– Avoir des sons (au format WAV) quelque part qui soient accessibles au script
– De quoi reproduire les sons à un volume audible à travers le bureau
A quoi ça va ressembler ?
L’idée est de faire un formulaire Windows tout bête, avec quelques boutons, et d’associer chaque bouton à un son. Pour cet article, je me contenterai de trois boutons et des sons système de Windows, libre à vous d’ajouter autant de boutons que vous voulez, et donc d’avoir les sons rigolos de votre choix.
Mais commençons par le commencement.
Tout d’abord, nous allons charger les modules qui vont bien pour pouvoir faire un joli formulaire (en Windows Forms, pas en WPF. J’ai la flemme de m’y mettre d’une part, et cela rendrait cet article inutilement complexe).
# Sampler # By Dédé Lateur #region Modules [void][System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") [void][System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") [System.Windows.Forms.Application]::EnableVisualStyles() #endregion
Regardons rapidement ce bout de code. Les lignes commençant par un dièse (#) sont des commentaires. Les lignes #region et #endregion permettent d’avoir un bloc qui peut être refermé si vous utilisez PowerShell ISE par exemple. Les trois lignes permettent de charger les modules qu’il nous faut, et d’activer les styles visuels pour le formulaire.
Ensuite, nous allons « pré-charger » nos sons (ou samples, ou échantillons). Je n’en mets que trois (car j’aurai trois boutons pour les déclencher), libre à vous d’en mettre autant que vous voulez (dans la limite du raisonnable).
#region Samples $sample1 = New-Object System.Media.SoundPlayer "$env:windirMedianotify.wav" $sample2 = New-Object System.Media.SoundPlayer "$env:windirMediading.wav" $sample3 = New-Object System.Media.SoundPlayer "$env:windirMediatada.wav" #endregion
Nos objets samples (judicieusement nommés $sample1, $sample2 et $sample3, c’est bien fait, hein ?) – de type System.Media.SoundPlayer comme vous pouvez le constater – n’ont guère besoin pour commencer que de pointer vers des fichiers. Comme je l’ai indiqué plus haut, pour l’instant je me contente des sons système de Windows, donc je peux utiliser la variable d’environnement $env:windir (qui pointe vers le répertoire d’installation de Windows, C:Windows en général) pour aller chercher mes fichiers .wav dans le répertoire Media. Si vous avez d’autres samples, mettez les bons chemins et noms de fichiers, et c’est tout.
Ensuite, nous allons créer un formulaire très simple :
#region Formulaire $form = New-Object Windows.Forms.Form # Pour bloquer le resize du form et supprimer les icônes Minimize et Maximize $form.FormBorderStyle = [System.Windows.Forms.FormBorderStyle]::FixedDialog $form.MaximizeBox = $False $form.MinimizeBox = $False $form.FormBorderStyle = [System.Windows.Forms.FormBorderStyle]::Fixed3D # Titre fenêtre $form.Text = "Dédé Sampler" # Taille $form.Size = New-Object System.Drawing.Size(210,100)
On crée donc un nouvel objet nommé $form (notre formulaire, le nom est bien trouvé, non ?), et on lui applique quelques propriétés. On fait dans le simple : pas de bouton Minimiser / Maximiser, une bordure fixe et en 3D, un titre que vous pourrez personnaliser ($form.Text) et enfin la taille de notre formulaire (210 pixels de large, pour 100 de haut). Plus vous rajouterez de boutons, plus vous devrez augmenter cette taille, bien évidemment.
Et pour ajouter un bouton, c’est simple :
# Boutons #pour ajouter un bouton, copier/coller ce bloc et modifier le chiffre (pour buttonX et sampleX), le .Text, la .Size et la .Location $button1 = New-Object System.Windows.Forms.Button $button1.Text = "Notify" $button1.Size = New-Object System.Drawing.Size(40,20) $button1.Location = New-Object System.Drawing.Size(20,20) $button1.UseVisualStyleBackColor = $True $button1.Add_Click({$sample1.Play()}) $form.Controls.Add($button1)
Pas d’inquiétude, on va décortiquer tout ça. D’abord, on créer un nouvel objet de type System.Windows.Forms.Button que l’on appelle très intelligemment $button1 vu que c’est le premier bouton de la série (spoiler : oui, les deux suivants s’appelleront respectivement $button2 et $button3).
Ensuite, on indique le texte de ce bouton (dans la propriété .Text, quelle coïncidence !). Vous faites ce que vous voulez, mais je vous conseille d’y mettre un truc en rapport avec le sample que vous allez utiliser.
A la ligne suivante, on indique la taille (.Size) en pixels (largeur puis hauteur) de ce bouton. Puis sa localisation (.Location) dans le formulaire, toujours en pixels, et toujours dans l’ordre abscisses puis ordonnées, à partir du coin supérieur gauche du formulaire (qui est aux coordonnées 0,0 en toute logique).
On indique ensuite que le bouton appliquera le style visuel du reste du formulaire (pour autant qu’on en ait défini un, ce qui n’est pas le cas, donc vous aurez une fenêtre Windows de base et toute moche, qui ne sera au passage pas la même entre un Windows 7 et un Windows 10).
Ensuite, on ajoute un gestionnaire d’évènement à notre bouton, en l’occurence Add_Click : c’est simple, si l’utilisateur clique sur ce bouton, cela doit déclencher la lecture du sample (ça pourrait faire autre chose, mais on se limite à ça), en appelant la méthode .Play() de l’objet $sample1. Voilà, c’est simple (bon dit comme ça, pas trop, mais sachez juste que quand vous cliquerez, ça jouera le sample).
Enfin, on ajoute le bouton à notre formulaire $form. Et on recommence pour les deux suivants (on change un peu la position de chaque bouton pour éviter qu’ils soient les uns sur les autres, sinon c’est pas pratique, ainsi que le texte et le sample associé, tant qu’à faire) :
$button2 = New-Object System.Windows.Forms.Button $button2.Text = "Ding" $button2.Size = New-Object System.Drawing.Size(40,20) $button2.Location = New-Object System.Drawing.Size(80,20) $button2.UseVisualStyleBackColor = $True $form.Controls.Add($button2) $button2.Add_Click({$sample2.Play()}) $button3 = New-Object System.Windows.Forms.Button $button3.Text = "Tada" $button3.Size = New-Object System.Drawing.Size(40,20) $button3.Location = New-Object System.Drawing.Size(140,20) $button3.UseVisualStyleBackColor = $True $form.Controls.Add($button3) $button3.Add_Click({$sample3.Play()})
Vous avez compris le principe, si vous devez rajouter des boutons, il suffit de copier/coller un des blocs, de changer le nom de l’objet, son texte, sa position, son sample associé, et voilà.
Pour finir, on affiche le formulaire qui contient nos bouton. Pour quitter le sampler, rien de plus de simple, il suffira de cliquer sur la croix en haut à droite, inutile de rajouter un bouton « Quitter » ou je ne sais quoi, restons simples et modestes (et j’ajouterai génial en ce qui me concerne).
# Affichage du form $form.ShowDialog() #endregion
Notez que la méthode ShowDialog() est « bloquante » : tant que le formulaire sera à l’écran, vous ne pourrez rien faire d’autre dans PowerShell. Les boutons apparaissent, il n’y a plus qu’à cliquer dessus frénétiquement. Sachez toutefois que si vous cliquez sur un bouton alors qu’un premier sample est déjà en lecture, le second sample démarre immédiatement et le premier sample est arrêté. Donc malheureusement, vous n’aurez pas plusieurs samples en simultané avec ce petit script.
Copiez/collez toutes les parties du script dans un fichier texte, et sauvegardez le tout en .ps1. Appelez-le depuis la console PowerShell (ou la touche « play » de l’ISE). Vous devriez obtenir ce truc là :
Et voilà. Amusez-vous bien entre collègues !