确定主音频卷的更改为事件(音量更改侦听器)

 卢-lydia09 发布于 2022-12-04 00:35

我想将Windows的主音量绑定到程序中的滑块.所以我搜索并找到了一些方法GETSET掌握了音量+一些像这样的库:

在C#中将主音频音量从XP更改为Windows 8

在C#中处理音量控制

n音讯

在某些地方,我看到一个带有LOOP的代码来获取音量值:循环

在某些地方,我看到一个带有TIMER的代码来获取音量值......

此外,我看到一些样本来确定音量,但在测试其中一个后,我在Windows 8中看到了运行时的一些错误:C# - 在Vista和Windows 7中调整主音量


编辑:

现在我有以下课程.我创建了它的一个实例,并使用propertychange事件通过Trace.WriteLine显示音量.但是,当我更改Windows音量时,它会导致无错误的错误!

public class AudioEndpointVolumeEnforcer : INotifyPropertyChanged
{
    private MMDeviceEnumerator mmDeviceEnumerator;
    private MMDevice mmDevice;
    private AudioEndpointVolume audioEndpointVolume;
    private bool _deviceIsMuted;
    private int _desiredVolume;
    private int _volumePercent;

    public AudioEndpointVolumeEnforcer()
    {
        try
        {
            mmDeviceEnumerator = new MMDeviceEnumerator();
            mmDevice = mmDeviceEnumerator.GetDefaultAudioEndpoint(EDataFlow.eRender, ERole.eMultimedia);
            audioEndpointVolume = mmDevice.AudioEndpointVolume;
            audioEndpointVolume.OnVolumeNotification += data =>
            {
                VolumePercent = Convert.ToInt16(data.MasterVolume*100);
                _deviceIsMuted = data.Muted;
            };
            DesiredVolume = 65;
        }
        catch (Exception ex)
        {
            // Logging logic here
        }
    }

    public int DesiredVolume
    {
        get { return _desiredVolume; }
        private set
        {
            if (_desiredVolume == value) return;
            _desiredVolume = value;

            //NotifyOfPropertyChange();
            OnPropertyChanged("DesiredVolume");

            Enforce(_desiredVolume);
        }
    }


    public int VolumePercent
    {
        get { return _volumePercent; }
        private set
        {
            if (_volumePercent == value) return;
            _volumePercent = value;
            if (_volumePercent != _desiredVolume)
            {
                _volumePercent = _desiredVolume;
                Enforce(_volumePercent);
            }
        }
    }

    public void Enforce(int pct, bool mute = false)
    {
        var adjusted = Convert.ToInt16(audioEndpointVolume.MasterVolumeLevelScalar*100);
        if (adjusted != DesiredVolume)
        {
            audioEndpointVolume.MasterVolumeLevelScalar = pct/100f;
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    [NotifyPropertyChangedInvocator]
    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }
}

使用课程:

 // Inside my window cunstractor >>
 audioVolume = new AudioEndpointVolumeEnforcer();
 audioVolume.PropertyChanged += MasterAudioVolumeChanged;


 private void MasterAudioVolumeChanged(object obj, PropertyChangedEventArgs eventArgs)
 {
   Trace.WriteLine(eventArgs.PropertyName+" - "+audioVolume.DesiredVolume);
 }

运行时错误:

......................................在此输入图像描述

"输出"面板显示Access violation错误:

The program '[18488] Audio.exe' has exited with code -1073741819 (0xc0000005) 'Access violation'

编辑

我通过断点和跟踪测试了上面的代码.以下错误有时发生在以下部分:

audioEndpointVolume.OnVolumeNotification += data =>
{
    VolumePercent = Convert.ToInt16(data.MasterVolume*100);
    _deviceIsMuted = data.Muted;
};

例如,有时它发生在这一行:

_deviceIsMuted = data.Muted;

但当我进入下一步时,F11 它不会在程序内显示正常错误!它会导致波纹管错误窗口和应用程序关闭!

......................................在此输入图像描述

Access violation

1 个回答
  • 您可以使用NAudio库:

    using NAudio;
    using NAudio.CoreAudioApi;
    
    private static MMDeviceEnumerator enumer = new MMDeviceEnumerator();
    private MMDevice dev = enumer.GetDefaultAudioEndpoint(DataFlow.Render, Role.Multimedia);
    
    public void Form1_Load(object sender, EventArgs e){
        dev.AudioEndpointVolume.OnVolumeNotification += AudioEndpointVolume_OnVolumeNotification;
    }
    
    void AudioEndpointVolume_OnVolumeNotification(AudioVolumeNotificationData data)
    {
        // This shows data.MasterVolume, you can do whatever you want here
        MessageBox.Show(data.MasterVolume.ToString());
    }
    

    此示例使用WinForms项目,但您也可以在其他位置创建事件.

    NAudio可以作为NuGet包安装,也可以从https://naudio.codeplex.com/安装

    音量范围从0.0f到1.0f,得到0-100只需:

    (int)(data.MasterVolume * 100f)
    

    2022-12-11 02:57 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有