- - Como silenciar automaticamente o som quando os fones de ouvido estão desconectados no Windows 10

Como silenciar automaticamente o som quando os fones de ouvido estão desconectados no Windows 10

O Windows 10 pode manter perfis de áudio separados paradiferentes dispositivos de áudio. Para cada dispositivo de áudio conectado, você pode definir um nível de volume diferente e, quando o dispositivo estiver conectado, o volume será ajustado automaticamente. Obviamente, ninguém mantém um dispositivo de áudio mudo o tempo todo. Eles aumentarão ou diminuirão o volume, mas ninguém silencia habitualmente um dispositivo de áudio. Se você usa um par de fones de ouvido na área de trabalho e geralmente precisa desconectá-los, pode usar um pequeno script do PowerShell que silencia automaticamente o som quando você desconecta os fones de ouvido.

Isso é algo que os celulares fazem, isto é,, quando você desconecta os fones de ouvido, a música para automaticamente. A lógica por trás disso é que você acabou de ouvir música ou removeu acidentalmente seus fones de ouvido e precisa de uma maneira rápida de desligá-lo. O script foi basicamente escrito com o mesmo princípio por Prateek Singh, da GEEKEEFY.

Silenciar automaticamente o som

Abra o Bloco de notas e cole o seguinte;

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

Salve-o com a extensão do arquivo PS1. Certifique-se de selecionar "Todos os arquivos" na lista suspensa de tipos de arquivo. Dê ao arquivo um nome que informe rapidamente o que ele faz. Salve-o em algum lugar que provavelmente não será excluído por acidente, mas também onde você poderá encontrá-lo facilmente, se necessário.

Executando o script

O PowerShell não pode apenas executar automaticamente um script. Existe uma medida de segurança integrada que impede que isso ocorra, mas existe uma maneira de contornar isso. Temos um artigo detalhado sobre como você pode fazer exatamente isso. Siga as instruções para executar automaticamente o script do PowerShell que você acabou de criar e use uma tarefa agendada para iniciar o script toda vez que você inicializar o PC.

Como alternativa, você pode executar manualmente o script ao inicializar o sistema. Uso-o há menos de 30 minutos e não sei como vivia sem ele antes.

Comentários