Windows 10에서 헤드폰이 분리되어 있을 때 자동으로 소리를 음소거하는 방법

Windows 10은 다양한 오디오 장치에 대해 별도의 오디오 프로필을 유지할 수 있습니다. 연결하는 각 오디오 장치에 대해 다른 볼륨 레벨을 설정할 수 있으며 장치가 연결되면 볼륨이 자동으로 조정됩니다. 물론 오디오 장치를 항상 음소거 상태로 유지하는 사람은 없습니다. 볼륨을 높이거나 낮추지만 아무도 습관적으로 오디오 장치를 음소거하지 않습니다.

데스크탑에서 헤드폰을 사용하고 자주 연결을 해제해야 하는 경우 헤드폰을 뽑을 때 자동으로 소리가 음소거되는 작은 PowerShell 스크립트를 사용할 수 있습니다.

이것은 휴대폰이 하는 일입니다. 즉, 헤드폰을 뽑으면 음악이 자동으로 멈춥니다. 그 이면의 논리는 음악 감상을 끝냈거나 실수로 헤드폰을 빼서 헤드폰을 빨리 끌 방법이 필요하다는 것입니다. 스크립트는 기본적으로 다음과 같은 원칙에 따라 작성되었습니다. GEEKEEFY의 Prateek Singh.

소리 자동 음소거

메모장을 열고 다음을 붙여넣습니다.

[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 스크립트를 자동으로 실행하고 예약된 작업을 사용하여 PC를 부팅할 때마다 스크립트를 시작합니다.

또는 시스템을 부팅할 때 스크립트를 수동으로 실행할 수 있습니다. 사용한지 30분도 안되었는데 이전에는 어떻게 살았는지 모르겠네요.