Как автоматично да изключите звука, когато слушалките са изключени в Windows 10

Windows 10 може да поддържа отделни аудио профили за различни аудио устройства. За всяко аудио устройство, което свързвате, можете да зададете различно ниво на силата на звука и когато устройството е свързано, силата на звука ще се регулира автоматично. Разбира се, никой не държи звука на аудио устройство през цялото време. Те ще увеличат или намалят силата на звука, но никой не заглушава по навик аудио устройство.

Ако използвате чифт слушалки с вашия работен плот и често се налага да ги изключвате, можете да използвате малък скрипт на PowerShell, който автоматично ще заглуши звука, когато изключите слушалките си.

Това е нещо, което правят мобилните телефони, т.е. когато изключите слушалките си, музиката спира автоматично. Логиката зад това е, че или сте приключили със слушането на музика, или случайно сте свалили слушалките си и имате нужда от бърз начин да ги изключите. Сценарият основно е написан на същия принцип от Пратик Сингх от GEEKEEFY.

  Как да добавите цифров клавиатура към вашата клавиатура на Windows 10

Автоматично заглушаване на звука

Отворете Notepad и поставете следното;

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

Запазете го с разширението на файла PS1. Уверете се, че сте избрали „Всички файлове“ от падащото меню тип файл. Дайте на файла име, което ще ви каже с един поглед какво прави. Запазете го някъде, където е малко вероятно да го изтриете случайно, но и където можете лесно да го намерите, ако трябва.

  Как да премахнете опцията за споделяне от контекстното меню в Windows 10

Изпълнение на скрипта

PowerShell не може просто да стартира автоматично скрипт. Има вградена мярка за сигурност, която му пречи да го направи, но има начин да го заобиколите. Имаме подробна статия за това как можете да направите точно това. Следвайте инструкциите, за да стартирате автоматично скрипта PowerShell, който току-що създадохте, и използвайте планирана задача, за да стартирате скрипта всеки път, когато стартирате компютъра си.

Като алтернатива можете да стартирате ръчно скрипта, когато стартирате системата си. Използвам го от по-малко от 30 минути и не знам как живеех без него преди.

  Как да изтеглите Windows 11 бета