Cómo silenciar automáticamente el sonido cuando los auriculares están desconectados en Windows 10

Windows 10 puede mantener perfiles de audio separados para diferentes dispositivos de audio. Para cada dispositivo de audio que conecte, puede establecer un nivel de volumen diferente y cuando el dispositivo esté conectado, el volumen se ajustará automáticamente. Por supuesto, nadie mantiene un dispositivo de audio en silencio todo el tiempo. Subirán o bajarán el volumen, pero nadie silencia habitualmente un dispositivo de audio.

Si usa un par de auriculares con su computadora de escritorio y, a menudo, tiene que desconectarlos, puede usar un pequeño script de PowerShell que silenciará automáticamente el sonido cuando desconecte sus auriculares.

Esto es algo que hacen los teléfonos móviles, es decir, cuando desconecta los auriculares, la música se detiene automáticamente. La lógica detrás de esto es que o ha terminado de escuchar música o se ha quitado accidentalmente los auriculares y necesita una forma rápida de apagarlos. Básicamente, el guión fue escrito con el mismo principio por Prateek Singh de GEEKEEFY.

  Restablecer la contraseña olvidada para Windows 10 Local / Cuenta de Microsoft

Silenciar automáticamente el sonido

Abra el Bloc de notas y pegue lo siguiente;

[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())]"
}
}

Guárdelo con la extensión de archivo PS1. Asegúrese de seleccionar ‘Todos los archivos’ en el menú desplegable de tipo de archivo. Asigne un nombre al archivo que le dirá de un vistazo lo que hace. Guárdelo en un lugar en el que no sea probable que lo elimine por accidente, pero también donde pueda encontrarlo fácilmente si lo necesita.

  Cómo grabar audio desde una aplicación en Windows 10 con Audacity

Ejecutando el guión

PowerShell no puede simplemente ejecutar automáticamente un script. Hay una medida de seguridad incorporada que le impide hacerlo, pero hay una forma de evitarlo. Tenemos un artículo detallado sobre cómo puede hacer precisamente eso. Siga las instrucciones para ejecutar automáticamente el script de PowerShell que acaba de crear y use una tarea programada para iniciar el script cada vez que inicie su PC.

Alternativamente, puede ejecutar manualmente el script cuando inicie su sistema. Lo he estado usando por menos de 30 minutos y no sé cómo vivía sin él antes.

  Cómo ver los atajos de teclado globales en Windows 10