Windows 10 offre la possibilité de mémoriser des configurations audio spécifiques pour chaque périphérique sonore connecté. Pour chacun de ces appareils, vous pouvez ajuster un niveau de volume personnalisé. Ainsi, lorsque vous reconnectez un appareil, le volume se règle automatiquement selon vos préférences. Bien sûr, il est rare qu’un utilisateur maintienne un périphérique audio en sourdine en permanence. Le volume est généralement ajusté à la hausse ou à la baisse, mais rarement complètement coupé.
Si vous utilisez régulièrement un casque sur votre ordinateur de bureau et que vous devez le débrancher fréquemment, un script PowerShell peut s’avérer très pratique. Ce script peut couper automatiquement le son dès que vous déconnectez votre casque.
Cette fonctionnalité est comparable à celle des téléphones portables. Lorsque vous retirez les écouteurs, la lecture de musique est automatiquement interrompue. Cette approche est logique : soit vous avez terminé l’écoute, soit vous avez accidentellement débranché votre casque et vous avez besoin d’une solution rapide pour arrêter la diffusion sonore. Le script que nous allons utiliser a été conçu selon cette même logique par Prateek Singh de GEEKEEFY.
Comment couper le son automatiquement
Commencez par ouvrir le Bloc-notes et collez-y le code suivant :
[cmdletbinding()] Param() #Adding definitions for accessing the Audio API Add-Type -TypeDefinition @' using System.Runtime.InteropServices; [Guid("5CDF2C82-841E-4546-9722-0CF74078229A"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] interface IAudioEndpointVolume { // f(), g(), ... are unused COM method slots. Define these if you care int f(); int g(); int h(); int i(); int SetMasterVolumeLevelScalar(float fLevel, System.Guid pguidEventContext); int j(); int GetMasterVolumeLevelScalar(out float pfLevel); int k(); int l(); int m(); int n(); int SetMute([MarshalAs(UnmanagedType.Bool)] bool bMute, System.Guid pguidEventContext); int GetMute(out bool pbMute); } [Guid("D666063F-1587-4E43-81F1-B948E807363F"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] interface IMMDevice { int Activate(ref System.Guid id, int clsCtx, int activationParams, out IAudioEndpointVolume aev); } [Guid("A95664D2-9614-4F35-A746-DE8DB63617E6"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] interface IMMDeviceEnumerator { int f(); // Unused int GetDefaultAudioEndpoint(int dataFlow, int role, out IMMDevice endpoint); } [ComImport, Guid("BCDE0395-E52F-467C-8E3D-C4579291692E")] class MMDeviceEnumeratorComObject { } public class Audio { static IAudioEndpointVolume Vol() { var enumerator = new MMDeviceEnumeratorComObject() as IMMDeviceEnumerator; IMMDevice dev = null; Marshal.ThrowExceptionForHR(enumerator.GetDefaultAudioEndpoint(/*eRender*/ 0, /*eMultimedia*/ 1, out dev)); IAudioEndpointVolume epv = null; var epvid = typeof(IAudioEndpointVolume).GUID; Marshal.ThrowExceptionForHR(dev.Activate(ref epvid, /*CLSCTX_ALL*/ 23, 0, out epv)); return epv; } public static float Volume { get {float v = -1; Marshal.ThrowExceptionForHR(Vol().GetMasterVolumeLevelScalar(out v)); return v;} set {Marshal.ThrowExceptionForHR(Vol().SetMasterVolumeLevelScalar(value, System.Guid.Empty));} } public static bool Mute { get { bool mute; Marshal.ThrowExceptionForHR(Vol().GetMute(out mute)); return mute; } set { Marshal.ThrowExceptionForHR(Vol().SetMute(value, System.Guid.Empty)); } } } '@ -Verbose While($true) { #Clean all events in the current session since its in a infinite loop, to make a fresh start when loop begins Get-Event | Remove-Event -ErrorAction SilentlyContinue #Registering the Event and Waiting for event to be triggered Register-WmiEvent -Class Win32_DeviceChangeEvent Wait-Event -OutVariable Event |Out-Null $EventType = $Event.sourceargs.newevent | ` Sort-Object TIME_CREATED -Descending | ` Select-Object EventType -ExpandProperty EventType -First 1 #Conditional logic to handle, When to Mute/unMute the machine using Audio API If($EventType -eq 3) { [Audio]::Mute = $true Write-Verbose "Muted [$((Get-Date).tostring())]" } elseif($EventType -eq 2 -and [Audio]::Mute -eq $true) { [Audio]::Mute = $false Write-Verbose "UnMuted [$((Get-Date).tostring())]" } }
Sauvegardez ce fichier en lui donnant l’extension .PS1. Veillez à choisir « Tous les fichiers » dans le menu déroulant des types de fichiers. Nommez le fichier de manière à ce que son objectif soit clair. Rangez-le dans un endroit sûr où vous ne risquez pas de le supprimer par inadvertance et où vous pourrez le retrouver facilement en cas de besoin.
Comment exécuter le script
Par mesure de sécurité, PowerShell ne peut pas exécuter un script automatiquement. Cependant, il existe une façon de contourner cette restriction. Nous avons un article détaillé qui explique comment faire exactement cela. Suivez les instructions pour automatiser l’exécution du script PowerShell que vous venez de créer et utilisez le planificateur de tâches pour lancer le script au démarrage de votre ordinateur.
Vous pouvez aussi lancer le script manuellement à chaque démarrage. Je l’utilise depuis moins d’une demi-heure et je me demande comment j’ai pu faire sans.