Windows 10 boleh menyimpan profil audio yang berasingan untuk peranti audio yang berbeza. Untuk setiap peranti audio yang anda sambungkan, anda boleh menetapkan tahap kelantangan yang berbeza dan apabila peranti disambungkan, kelantangan akan melaraskan secara automatik. Sudah tentu, tiada siapa yang memastikan peranti audio diredam sepanjang masa. Mereka akan menambah atau mengurangkan kelantangan tetapi tiada siapa yang lazimnya membisukan peranti audio.
Jika anda menggunakan sepasang fon kepala dengan desktop anda, dan selalunya terpaksa memutuskan sambungannya, anda boleh menggunakan sedikit skrip PowerShell yang akan meredam bunyi secara automatik apabila anda mencabut fon kepala anda.
Ini adalah sesuatu yang dilakukan oleh telefon mudah alih iaitu, apabila anda mencabut fon kepala anda, muzik berhenti secara automatik. Logik di sebalik ini ialah anda telah selesai mendengar muzik atau anda telah mengeluarkan fon kepala anda secara tidak sengaja dan anda memerlukan cara cepat untuk mematikannya. Skrip itu pada asasnya ditulis berdasarkan prinsip yang sama oleh Prateek Singh dari GEEKEEFY .

Redam Bunyi secara automatik
Buka Notepad dan tampal yang berikut;
[cmdletbinding()] Param() #Menambah definisi untuk mengakses Audio API Add-Type -TypeDefinition @' menggunakan System.Runtime.InteropServices; [Guid("5CDF2C82-841E-4546-9722-0CF74078229A"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] antara muka IAudioEndpointVolume { // f(), g(), ... ialah slot kaedah COM yang tidak digunakan. Tentukan ini jika anda mengambil berat 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(keluar bool pbMute); } [Guid("D666063F-1587-4E43-81F1-B948E807363F"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] antara muka IMMDevice { int Activate(ref System.Guid id, int clsCtx, int activationParams, keluar IAudioEndpointVolume aev); } [Guid("A95664D2-9614-4F35-A746-DE8DB63617E6"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] antara muka IMMDeviceEnumerator { int f(); // Unused int GetDefaultAudioEndpoint(int dataFlow, int role, out IMMMevice endpoint); } [ComImport, Guid("BCDE0395-E52F-467C-8E3D-C4579291692E")] kelas MMDeviceEnumeratorComObject { } kelas awam Audio { statik IAudioEndpointVolume Vol() { var enumerator = MMDeviceEnumeratorEnumeratorComObject baharu; IMMDevice dev = batal; 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)); pulangan epv; } apungan statik awam Isipadu { dapatkan {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)); kembali bisu; } set { Marshal.ThrowExceptionForHR(Vol().SetMute(value, System.Guid.Empty)); } } } '@ -Verbose While($true) { #Bersihkan semua acara dalam sesi semasa sejak ia dalam gelung tak terhingga, untuk membuat permulaan baharu apabila gelung bermula Dapatkan-Acara | Remove-Event -ErrorAction Secara SenyapTeruskan #Mendaftar Acara dan Menunggu acara dicetuskan Register-WmiEvent -Class Win32_DeviceChangeEvent Wait-Event -OutVariable Event |Out-Null $EventType = $Event.sourceargs. acara baharu | ` Isih-Objek TIME_CREATED -Menurun | ` Select-Object EventType -ExpandProperty EventType -Pertama 1 #Logik bersyarat untuk dikendalikan, Bila untuk Membisukan/Nyahredam mesin menggunakan Audio API If($EventType -eq 3) { [Audio]::Mute = $true Write-Verbose "Diredamkan [$((Get-Date).tostring())]" } elseif($EventType -eq 2 -dan [Audio]::Mute -eq $true) { [Audio]::Mute = $false Write-Verbose " Nyahredam [$((Get-Date).tostring())]" } }
Simpannya dengan sambungan fail PS1. Pastikan anda memilih 'Semua Fail' daripada menu lungsur jenis fail. Beri nama fail yang akan memberitahu anda sepintas lalu apa yang dilakukannya. Simpannya di tempat yang anda tidak mungkin memadamkannya secara tidak sengaja tetapi juga di mana anda boleh menemuinya dengan mudah jika perlu.
Menjalankan Skrip
PowerShell tidak boleh autorun skrip sahaja. Terdapat langkah keselamatan terbina dalam yang menghalangnya daripada berbuat demikian tetapi ada cara untuk mengatasinya. Kami mempunyai artikel terperinci tentang cara anda boleh melakukannya. Ikut arahan untuk menjalankan skrip PowerShell secara automatik yang baru anda buat dan gunakan tugas yang dijadualkan untuk memulakan skrip setiap kali anda but PC anda.
Sebagai alternatif, anda boleh menjalankan skrip secara manual apabila anda boot sistem anda. Saya telah menggunakannya kurang daripada 30 minit dan saya tidak tahu bagaimana saya hidup tanpanya sebelum ini.