在Windows 7 x64中使用C#静音/取消静音并更改主音量

9

我该如何使用C#调整Windows 7的主音量?

我看到过一个使用winmm.dll 这里 的优秀实现,但它只适用于XP而不是Windows 7。


可能是重复的 https://dev59.com/VU7Sa4cB1Zd3GeqP3nNt#3046715 - user285594
2个回答

12

我使用了Nuget包Naudio并成功地使用了以下代码:

public void SetVolume(int level)
   {
            try
            {
                //Instantiate an Enumerator to find audio devices
                    NAudio.CoreAudioApi.MMDeviceEnumerator MMDE = new NAudio.CoreAudioApi.MMDeviceEnumerator();
                        //Get all the devices, no matter what condition or status
                NAudio.CoreAudioApi.MMDeviceCollection DevCol = MMDE.EnumerateAudioEndPoints(NAudio.CoreAudioApi.DataFlow.All, NAudio.CoreAudioApi.DeviceState.All);
                //Loop through all devices
                foreach (NAudio.CoreAudioApi.MMDevice dev in DevCol)
                {
                    try
                    {
                        if (dev.State == NAudio.CoreAudioApi.DeviceState.Active)
                        {
                            var newVolume = (float)Math.Max(Math.Min(level, 100),0) / (float)100;

                            //Set at maximum volume
                            dev.AudioEndpointVolume.MasterVolumeLevelScalar = newVolume;

                            dev.AudioEndpointVolume.Mute = level == 0;

                            //Get its audio volume
                            _log.Info("Volume of " + dev.FriendlyName + " is " + dev.AudioEndpointVolume.MasterVolumeLevelScalar.ToString());
                        }
                        else
                        {
                            _log.Debug("Ignoring device " + dev.FriendlyName + " with state " + dev.State);
                        }
                    }
                    catch (Exception ex)
                    {
                        //Do something with exception when an audio endpoint could not be muted
                        _log.Warn(dev.FriendlyName + " could not be muted with error " + ex);
                    }
                }
            }
            catch (Exception ex)
            {
                //When something happend that prevent us to iterate through the devices
                _log.Warn("Could not enumerate devices due to an excepion: " + ex.Message);
            }
        }

5
CodeProject有一个非常好的示例,在这里。请注意,它完全依赖于COM互操作(如果您对实现细节感兴趣,请查看像IAudioEndpointVolumeIAudioMeterInformation这样的COM接口),仅适用于Vista / Win7及更高版本。

最低支持客户端:Windows Vista

最低支持服务器:Windows Server 2008


1
非常好,我测试了一下,在Windows 7 x64上运行良好。非常感谢! - KalEl
4
这篇 CodeProject 文章已被删除 :( 有没有人能够在这里插入代码? - oo_dev
1
这个答案包含一些代码(可能不是来自已删除的codeproject文章的代码,但至少包含了必要的COM接口和定义):https://dev59.com/OWYq5IYBdhLWcg3wpyRE#14322736 - max

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接