FRFAM.COM >> Famille >> Technologie &Innovation >> Informatique

Désactiver automatiquement le son des haut-parleurs sous Windows au débranchement des écouteurs

Imaginez couper instantanément le son de votre PC lorsque vous débranchez vos écouteurs : adieu les réveils intempestifs de vos colocataires ou les fuites audio embarrassantes en public !

Vous pouvez bien sûr gérer le volume manuellement via le mélangeur Windows (découvrez comment personnaliser le son sous Windows 10), mais automatiser cette tâche avec PowerShell est bien plus efficace et professionnel.

Découvrez comment implémenter un mute automatique des haut-parleurs lors du retrait des écouteurs, comme sur les smartphones.

1. Ouvrez le Bloc-notes et collez le script PowerShell corrigé et optimisé ci-dessous :

[CmdletBinding()]
Param()

# Ajout des définitions pour accéder à l'API Audio
Add-Type -TypeDefinition @'
using System.Runtime.InteropServices;

[Guid("5CDF2C82-841E-4546-9722-0CF74078229A"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
interface IAudioEndpointVolume {
  // f(), g(), etc. sont des placeholders COM inutilisés
  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();
  int GetDefaultAudioEndpoint(int dataFlow, int role, out IMMDevice endpt);
}

[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) {
  # Nettoyer les événements précédents
  Get-Event | Remove-Event -ErrorAction SilentlyContinue
  # Enregistrer l'événement de changement de périphérique
  Register-WmiEvent -Class Win32_DeviceChangeEvent
  Wait-Event -OutVariable Event | Out-Null
  $EventType = $Event.SourceArgs.NewEvent | Sort-Object TimeCreated -Descending | Select-Object -ExpandProperty EventType -First 1
  # Logique : mute au débranchement (EventType 3 = removal), unmute au branchement (EventType 2 = arrival)
  if ($EventType -eq 3) {
    [Audio]::Mute = $true
    Write-Verbose "Muet activé [$((Get-Date).ToString())]"
  } elseif ($EventType -eq 2 -and [Audio]::Mute -eq $true) {
    [Audio]::Mute = $false
    Write-Verbose "Démuté [$((Get-Date).ToString())]"
  }
}

2. Enregistrez le fichier en tant que AutoMute.ps1 (sélectionnez "Tous les fichiers" dans le type).

3. Avertissement de sécurité : Exécutez PowerShell en tant qu'administrateur si nécessaire (Set-ExecutionPolicy RemoteSigned). Clic droit sur le fichier > "Exécuter avec PowerShell". Le script tourne jusqu'au redémarrage.

Ce script utilise l'API Windows Audio et les événements WMI pour une détection fiable. Testé sous Windows 10/11.

PowerShell booste votre productivité Windows avec des milliers d-applets de commande avancées.

Crédit image : peus/Depositphotos

[]