ホームページ > バックエンド開発 > C++ > C# を使用して Windows でアプリケーション ボリュームをプログラム的に制御するにはどうすればよいですか?

C# を使用して Windows でアプリケーション ボリュームをプログラム的に制御するにはどうすればよいですか?

Susan Sarandon
リリース: 2025-01-19 22:43:09
オリジナル
704 人が閲覧しました

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

Windows ボリューム ミキサーでアプリケーションの音量を制御

アプリケーションの音量レベルは、特に 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 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート