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

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

Windows 10 puede mantener perfiles de audio separados paradiferentes 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 silenciado todo el tiempo. Aumentarán o disminuirán el volumen, pero nadie habitualmente silencia 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 los 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 ha terminado de escuchar música o se ha quitado accidentalmente los auriculares y necesita una forma rápida de apagarlo. El guión fue escrito básicamente en ese mismo principio por Prateek Singh de GEEKEEFY.

Silenciar sonido automáticamente

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. Dé un nombre al archivo que le dirá de un vistazo lo que hace. Guárdelo en un lugar donde sea poco probable que lo elimine por accidente, pero también donde pueda encontrarlo fácilmente si lo necesita.

Ejecutando el script

PowerShell no solo puede ejecutar automáticamente un script. Hay una medida de seguridad incorporada que impide que lo haga, pero hay una forma de evitarlo. Tenemos un artículo detallado sobre cómo puede hacer exactamente 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 inicia su sistema. Lo he estado usando por menos de 30 minutos y no sé cómo vivía sin él antes.

Comentarios