> 백엔드 개발 > 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 Volume Mixer로 애플리케이션 볼륨 제어

특히 Windows 7 이상의 운영 체제에서는 Windows Core Audio Library를 통해 애플리케이션 볼륨 수준에 쉽게 액세스하고 조작할 수 있습니다.

코드 예:

다음 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으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿