我想将Windows的主音量绑定到程序中的滑块.所以我搜索并找到了一些方法GET
或SET
掌握了音量+一些像这样的库:
在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
您可以使用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)