Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Mengawal Kelantangan Aplikasi Secara Program dalam Windows Menggunakan C#?
Kawal volum aplikasi dengan Windows Volume Mixer
Tahap kelantangan aplikasi boleh diakses dan dimanipulasi dengan mudah melalui Windows Core Audio Library, terutamanya pada sistem pengendalian Windows 7 dan ke atas.
Contoh kod:
Coretan kod aplikasi konsol C# berikut menunjukkan cara mengawal volum aplikasi melalui antara muka pengadun volum:
<code class="language-csharp">using System; using System.Runtime.InteropServices; using System.Collections.Generic; namespace SetAppVolume { class Program { static void Main(string[] args) { const string app = "Mozilla Firefox"; foreach (string name in EnumerateApplications()) { Console.WriteLine($"应用名称: {name}"); if (name == app) { // 显示静音状态和音量级别(相对于主音量百分比) Console.WriteLine($"静音状态: {GetApplicationMute(app)}"); Console.WriteLine($"音量级别: {GetApplicationVolume(app)}"); // 静音该应用程序 SetApplicationMute(app, true); // 将音量设置为主音量的一半(50%) SetApplicationVolume(app, 50); } } } // 获取应用程序音量 public static float? GetApplicationVolume(string name) { ISimpleAudioVolume volume = GetVolumeObject(name); if (volume == null) return null; float level; volume.GetMasterVolume(out level); return level * 100; } // 获取应用程序静音状态 public static bool? GetApplicationMute(string name) { ISimpleAudioVolume volume = GetVolumeObject(name); if (volume == null) return null; bool mute; volume.GetMute(out mute); return mute; } // 设置应用程序音量 public static void SetApplicationVolume(string name, float level) { ISimpleAudioVolume volume = GetVolumeObject(name); if (volume == null) return; Guid guid = Guid.Empty; volume.SetMasterVolume(level / 100, ref guid); } // 设置应用程序静音状态 public static void SetApplicationMute(string name, bool mute) { ISimpleAudioVolume volume = GetVolumeObject(name); if (volume == null) return; Guid guid = Guid.Empty; volume.SetMute(mute, ref guid); } // 枚举应用程序 public static IEnumerable<string> EnumerateApplications() { // 获取扬声器(第一个渲染+多媒体)设备 IMMDeviceEnumerator deviceEnumerator = (IMMDeviceEnumerator)(new MMDeviceEnumerator()); IMMDevice speakers; deviceEnumerator.GetDefaultAudioEndpoint(EDataFlow.eRender, ERole.eMultimedia, out speakers); // 激活会话管理器。我们需要枚举器 Guid IID_IAudioSessionManager2 = typeof(IAudioSessionManager2).GUID; object o; speakers.Activate(ref IID_IAudioSessionManager2, 0, IntPtr.Zero, out o); IAudioSessionManager2 mgr = (IAudioSessionManager2)o; // 枚举此设备上的会话 IAudioSessionEnumerator sessionEnumerator; mgr.GetSessionEnumerator(out sessionEnumerator); int count; sessionEnumerator.GetCount(out count); for (int i = 0; i < count; i++) { IAudioSessionControl session; sessionEnumerator.GetSession(i, out session); string name; session.GetDisplayName(out name); yield return name; } } // 获取音量对象 private static ISimpleAudioVolume GetVolumeObject(string name) { IMMDeviceEnumerator deviceEnumerator = (IMMDeviceEnumerator)(new MMDeviceEnumerator()); IMMDevice speakers; deviceEnumerator.GetDefaultAudioEndpoint(EDataFlow.eRender, ERole.eMultimedia, out speakers); Guid IID_IAudioSessionManager2 = typeof(IAudioSessionManager2).GUID; object o; speakers.Activate(ref IID_IAudioSessionManager2, 0, IntPtr.Zero, out o); IAudioSessionManager2 mgr = (IAudioSessionManager2)o; IAudioSessionEnumerator sessionEnumerator; mgr.GetSessionEnumerator(out sessionEnumerator); int count; sessionEnumerator.GetCount(out count); for (int i = 0; i < count; i++) { IAudioSessionControl session; sessionEnumerator.GetSession(i, out session); string displayName; session.GetDisplayName(out displayName); if (displayName.Contains(name)) { ISimpleAudioVolume simpleAudioVolume; session.SimpleAudioVolume.QueryInterface(ref typeof(ISimpleAudioVolume).GUID, out simpleAudioVolume); return simpleAudioVolume; } } return null; } // COM 接口定义 (需添加引用:MMDeviceAPI) [DllImport("mmdevapi.dll")] private static extern int MMDeviceAPI_Activate(IntPtr pUnkOuter, ref Guid riid, uint dwClsContext, IntPtr pActivationParams, out IntPtr ppv); [Guid("BCDE0395-E52F-467C-8E3D-C4579291692E")] private interface IMMDeviceEnumerator { } [Guid("A95664D2-9614-4F35-A746-DE8DB63617E6")] private interface IMMDevice { } [Guid("7BFF96D5-5F1E-4FA2-83A6-4B2869139647")] private interface IAudioSessionManager2 { } [Guid("E2F5BB11-0570-40CA-ACDD-3AA01277DEE8")] private interface IAudioSessionEnumerator { } [Guid("87CE5498-68D6-44E5-9215-6DA47EF882D7")] private interface IAudioSessionControl { } [Guid("F4B1A599-EFA4-4557-A0C9-05499AB9FB33")] private interface ISimpleAudioVolume { } private enum EDataFlow : uint { eRender = 0, eCapture = 1, eAll = 2 } private enum ERole : uint { eConsole = 0, eMultimedia = 1, eCommunications = 2 } } }</code>
Sila ambil perhatian bahawa kod ini memerlukan penambahan rujukan kepada MMDeviceAPI
. Antara muka COM digunakan dalam kod, dan pengecualian yang sepadan perlu dikendalikan dan objek COM mesti dikeluarkan dengan betul untuk mengelakkan kebocoran sumber. Selain itu, Mozilla Firefox
perlu digantikan dengan nama aplikasi yang ingin anda kawal. Kod ini adalah untuk rujukan sahaja dan mungkin perlu dilaraskan mengikut keadaan tertentu dalam aplikasi sebenar.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengawal Kelantangan Aplikasi Secara Program dalam Windows Menggunakan C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!