c#中的音量控制。如何为卷分配值? [复制]
Posted
技术标签:
【中文标题】c#中的音量控制。如何为卷分配值? [复制]【英文标题】:volume control in c#. How do I assign a value to the volume? [duplicate] 【发布时间】:2020-01-13 01:02:59 【问题描述】:在我的程序中,我可以使用系统变量来增加音量和减小音量,例如
private const int APPCOMMAND_VOLUME_MUTE = 0x80000;
private const int APPCOMMAND_VOLUME_UP = 0xA0000;
private const int APPCOMMAND_VOLUME_DOWN = 0x90000;
private const int WM_APPCOMMAND = 0x319;
但是是否有一个系统变量允许我为其分配一个值。例如,将音量设置为 57,而不是增加或减少以达到该值。
最终想要做的是使用轨迹栏来调整音量。向任一方向拖动时,trackbar 应等于系统音量,以相应地更改音量。
【问题讨论】:
可能是helpful 你有mixerSetControlDetails和CoreAudio的IAudioEndpointVolume接口SetMasterVolumeLevelScalar方法。一个实现是here。 CoreAudio方法,我只在VB.Net中实现过。 如果你不会说这种语言,我可以把它翻译成C#。不过,这几乎是一样的。 【参考方案1】:您可以使用 NuGet 包 Audioswitcher.AudioApi.CoreAudio 作为回答这里: How to programmatically set the system volume?
通过代码:
CoreAudioDevice defaultPlaybackDevice = new CoreAudioController().DefaultPlaybackDevice;
Debug.WriteLine("Current Volume:" + defaultPlaybackDevice.Volume);
defaultPlaybackDevice.Volume = 80;
注意:如果设备静音它不会取消静音,它会在默认播放设备上将音量设置在 [0;100] 范围内,所以如果你想取消静音,你应该调用:
defaultPlaybackDevice.Mute(false);
为了您的目的,它还提供事件 VolumeChanged 和 MuteChanged 来跟踪内部音量变化。
在内部,它使用 Core Audio API,它是基于 COM 的低级音频控制 API,在 Windows Vista 启动时提供。
如果你想编写自己的包装器来做这样的事情,你应该看到 IAudioEndpointVolume 接口 (https://docs.microsoft.com/en-us/windows/win32/api/endpointvolume/nn-endpointvolume-iaudioendpointvolume)
内部音量通知实现为结构 AUDIO_VOLUME_NOTIFICATION_DATA (https://docs.microsoft.com/en-us/windows/win32/api/endpointvolume/ns-endpointvolume-audio_volume_notification_data) 中提供的信息内的回调
此外,如果您希望您的应用支持 Windows XP,您应该使用旧版 WinMM API 及其函数 waveOutSetVolume。
【讨论】:
谢谢,我在哪里可以获得音频切换器 api。当我尝试使用代码时无法将 coreaudiodevice 识别为有效数据类型。 使用 NuGet 包管理器在您的项目中安装 NuGet 包。链接到这些 nuget:nuget.org/packages/AudioSwitcher.AudioApi.CoreAudio 谢谢。我能够获得 github 的 dll。来自其他项目。以上是关于c#中的音量控制。如何为卷分配值? [复制]的主要内容,如果未能解决你的问题,请参考以下文章