A hang automatikus némítása, ha a fejhallgatót kihúzzák a Windows 10 rendszeren

A Windows 10 képes külön hangprofilokat tartani a különböző audioeszközökhöz. Minden csatlakoztatott audioeszközhöz különböző hangerőszintet állíthat be, és amikor az eszköz csatlakoztatva van, a hangerő automatikusan beáll. Természetesen senki sem tartja állandóan elnémítva az audioeszközt. Növelik vagy csökkentik a hangerőt, de senki sem némítja el az audioeszközt.

Ha fejhallgatót használ az asztalon, és gyakran le kell választania őket, használhat egy kis PowerShell-szkriptet, amely automatikusan elnémítja a hangot, amikor kihúzza a fejhallgatót.

Ezt a mobiltelefonok teszik, azaz amikor kihúzza a fejhallgatót, a zene automatikusan leáll. Ennek logikája az, hogy vagy befejezte a zenehallgatást, vagy véletlenül eltávolította a fejhallgatót, és gyorsan ki kell kapcsolnia. A forgatókönyvet alapvetően ugyanezen az elven írta Prateek Singh a GEEKEEFY-től.

Hang automatikus némítása

Nyissa meg a Jegyzettömböt, és illessze be a következőket;

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

Mentse el a PS1 fájlkiterjesztéssel. Győződjön meg arról, hogy a fájltípus legördülő menüből válassza az „Összes fájl” lehetőséget. Adjon a fájlnak egy nevet, amely egy pillantással megmondja, mit csinál. Mentse el olyan helyre, ahol valószínűleg nem törli véletlenül, de olyan helyre is, ahol szükség esetén könnyen megtalálhatja.

  Windows Me, 20 évvel később: Tényleg olyan rossz volt?

A Script futtatása

A PowerShell nem tud csak úgy automatikusan futtatni egy szkriptet. Van egy beépített biztonsági intézkedés, amely megakadályozza ezt, de van kiút. Van egy részletes cikkünk arról, hogyan teheti ezt meg. Kövesse az utasításokat az imént létrehozott PowerShell-szkript automatikus futtatásához, és egy ütemezett feladat segítségével indítsa el a szkriptet a számítógép minden indításakor.

Alternatív megoldásként manuálisan is futtathatja a szkriptet a rendszer indításakor. Kevesebb, mint 30 perce használom, és nem tudom, hogy éltem nélküle korábban.