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#中的音量控制。如何为卷分配值? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何为 mac 应用程序制作音量滑块

在 C# 中设置系统卷 Windows 10 [重复]

C# - 使用外部 Midi 控制器更改音量

如何使用 C# 使用 ALSA 在 Linux 中获取和设置音量?

如何为 C# 字典中的多个键分配一个值?

C# win7 win10 系统音量控制