用C#实现windows扬声器静音

如果是winform,比较简单,发个消息即可:

复制代码
        const int APPCOMMAND_VOLUME_MUTE = 0x80000;
        const int WM_APPCOMMAND = 0x319;

        [DllImport("user32.dll")]
        static extern IntPtr SendMessageW(IntPtr hWnd, int Msg,
            IntPtr wParam, IntPtr lParam);

        private void Mute()
        {
            SendMessageW(this.Handle, WM_APPCOMMAND, this.Handle,
                (IntPtr)APPCOMMAND_VOLUME_MUTE);
        }
复制代码

如果是控制台程序,则比较麻烦,需要用COM,找了个Codeplex的项目 https://archive.codeplex.com/?p=netcoreaudio (2021年7月将关闭!),稍微修改了一下代码:

复制代码
using Vannatech.CoreAudio.Interfaces;
using Vannatech.CoreAudio.Constants;
using Vannatech.CoreAudio.Structures;
using Vannatech.CoreAudio.Enumerations;
using Vannatech.CoreAudio.Externals;

        const string IAudioEndpointVolumeIID = "5CDF2C82-841E-4546-9722-0CF74078229A";

        public class DeviceActivation
        {
            public IMMDevice MMDevice { get; set; }
            public string Id { get; set; }
            public IAudioEndpointVolume ActiveInterface { get; set; }
        }

        static void Main(string[] args)
        {
            object objInstance = null;
            var iid = new Guid(IAudioEndpointVolumeIID);
            DeviceActivation activation = null;

            try
            {
                var deviceEnumeratorType = Type.GetTypeFromCLSID(new Guid(ComCLSIDs.MMDeviceEnumeratorCLSID));
                var deviceEnumerator = (IMMDeviceEnumerator)Activator.CreateInstance(deviceEnumeratorType);
                IMMDeviceCollection deviceCollection;
                deviceEnumerator.EnumAudioEndpoints(EDataFlow.eAll, DEVICE_STATE_XXX.DEVICE_STATEMASK_ALL, out deviceCollection);
                UInt32 deviceCount;
                deviceCollection.GetCount(out deviceCount);

                IMMDevice device = null;
                string deviceId = null;
                for (uint i = 0; i < deviceCount; i++)
                {
                    deviceCollection.Item(i, out device);
                    device.GetId(out deviceId);
                    if (deviceId == "{0.0.0.00000000}.{568726bc-cd16-4c9e-a569-f625b5d5b499}")
                    {
                        var result = device.Activate(iid, (uint)CLSCTX.CLSCTX_INPROC_SERVER, IntPtr.Zero, out objInstance);
                        break;
                    }
                }

                if (objInstance != null)
                {
                    activation = new DeviceActivation
                    {
                        MMDevice = device,
                        Id = deviceId,
                        ActiveInterface = (IAudioEndpointVolume)objInstance
                    };
                }

                bool muteOrig, muteNew;
                if (activation != null)
                {
                    activation.ActiveInterface.GetMute(out muteOrig);
                    if (!muteOrig)
                    {
                        muteNew = !muteOrig;
                        Guid context = Guid.NewGuid();
                        var result = activation.ActiveInterface.SetMute(muteNew, context);
                    }
                }
            }
            catch (Exception ex)
            {
            }
            finally
            {
                if (activation != null)
                {
                    Marshal.FinalReleaseComObject(activation.MMDevice);
                    Marshal.FinalReleaseComObject(activation.ActiveInterface);
                }
            }
        }
复制代码

这里的{0.0.0.00000000}.{568726bc-cd16-4c9e-a569-f625b5d5b499}是调试出来的,不同的机器有可能不同。

 

posted @   平静寄居者  阅读(609)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示