Home > Backend Development > C++ > How Can I Programmatically Control Application Volume in Windows Using C#?

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

Susan Sarandon
Release: 2025-01-19 22:43:09
Original
704 people have browsed it

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

Control application volume with Windows Volume Mixer

Application volume levels can be easily accessed and manipulated through the Windows Core Audio Library, especially on Windows 7 and above operating systems.

Code example:

The following C# console application code snippet demonstrates how to control application volume through the volume mixer interface:

<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>
Copy after login

Please note that this code requires adding a reference to MMDeviceAPI. The COM interface is used in the code, and corresponding exceptions need to be handled and the COM objects must be released correctly to avoid resource leaks. Additionally, Mozilla Firefox needs to be replaced with the name of the application you want to control. This code is for reference only and may need to be adjusted according to specific circumstances in actual applications.

The above is the detailed content of How Can I Programmatically Control Application Volume in Windows Using C#?. For more information, please follow other related articles on the PHP Chinese website!

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Articles by Author
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template