首页 > 后端开发 > C++ > 如何使用 C# 以编程方式控制 Windows 中的应用程序音量?

如何使用 C# 以编程方式控制 Windows 中的应用程序音量?

Susan Sarandon
发布: 2025-01-19 22:43:09
原创
662 人浏览过

How Can I Programmatically Control Application Volume in Windows Using C#?

利用Windows音量混合器控制应用程序音量

通过Windows核心音频库,尤其是在Windows 7及更高版本的操作系统上,可以轻松访问和操作应用程序的音量级别。

代码示例:

以下C#控制台应用程序代码片段演示了如何通过音量混合器界面控制应用程序音量:

<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>
登录后复制

请注意,此代码需要添加对 MMDeviceAPI 的引用。 代码中使用了COM接口,需要处理相应的异常情况,并确保正确释放COM对象以避免资源泄漏。 此外,Mozilla Firefox 需要替换成你想要控制的应用程序的名称。 该代码仅供参考,实际应用中可能需要根据具体情况进行调整。

以上是如何使用 C# 以编程方式控制 Windows 中的应用程序音量?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板