\r\n\r\n
ヘッドホンを外すと、パソコンの音声出力が自動的にミュートされるようになったら、いいと思いませんか?これなら、早朝にうっかり同居人を起こしてしまったり、公共の場で間違えてブリトニー・スピアーズへの愛を明かしてしまったりすることもないでしょう。
もちろん、ボリュームミキサーを使って、スピーカーやヘッドホンを1つずつミュートすることも可能です。(Windows10でサウンドをカスタマイズする方法について詳しくはこちら)しかし、正直なところ、PowerShellを使って自動化できるのであれば、これを行う必要はない。
スマート○○のように、ヘッドホンを外すとパソコンの音声が自動的にミュートされる方法をご紹介します。
まず、メモ帳を開き、次のコードを空白の文書に貼り付けます。
[cmdletbinding()]Param()#Adding definiti*** for accessing the Audio APIAdd-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 careint 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(); // Unusedint 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)); }}}'@ -VerboseWhile($true){#Clean all events in the current session since its in a infinite loop, to make a fresh start when loop beginsGet-Event | Remove-Event -ErrorAction SilentlyContinue#Registering the Event and Waiting for event to be triggeredRegister-WmiEvent -Class Win32_DeviceChangeEventWait-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 APIIf($EventType -eq 3) {[Audio]::Mute = $trueWrite-Verbose "Muted [$((Get-Date).tostring())]"}elseif($EventType -eq 2 -and [Audio]::Mute -eq $true){[Audio]::Mute = $falseWrite-Verbose "UnMuted [$((Get-Date).tostring())]"}}ここで、PS1形式で保存する必要があります。ファイルの保存ダイアログが表示されたら、ドロップダウンメニューから「すべてのファイル」を選択し、ファイル名を「AutoMute.ps1」とします。 ファイル名自体は重要ではありませんので、覚えやすいものを選択してください。
スクリプトを有効にするには、新しく作成したファイルを右クリックして、「実行」を選択します。スクリプトは、コンピュータの電源を切るまで有効です。
これは、PowerShellがあなたの生産性を向上させる数多くの方法のうちの1つです。Windowsの操作性を向上させるPowerShellコマンドレットが多数用意されています。
写真提供:peus/photo