获取当前系统音量(Windows 10)

4

我想要找到当前系统音量并在音量混合器中设置我的应用程序的音量,但似乎我发现的所有东西都有以下问题:

  • 可以 更改系统音量(一个问题解决)
  • 不能 更改应用程序音量
  • 或者根本不起作用
  • 到目前为止,没有任何东西能够成功获取系统音量

我们目前正在使用nircmd来设置全局音量,这非常好,但它似乎没有选项可以GET当前音量,以便稍后将音量恢复到原来的状态。至于设置应用程序本身的值,而不是全局音量,我一直在寻找每个可能的线程,但我所找到的所有内容(包括此处以及其他地方)都引导我进入C ++文档或C#该库周围的包装器,但由于根本上每个函数的无效转换,该代码根本不起作用。

这里有一个来自stackoverflow的破碎代码示例:控制音量混音器

我发现所有这些库/代码示例都会做到这一点:

private static ISimpleAudioVolume GetVolumeObject(int pid)
   {
       IMMDeviceEnumerator deviceEnumerator = 
       (IMMDeviceEnumerator)(new MMDeviceEnumerator());

由于以下原因,会出现无效的类型转换问题:

此处存在问题:

internal class MMDeviceEnumerator
{
}
internal interface IMMDeviceEnumerator
{
}

它试图强制转换的类没有实现该接口,因此似乎转换无效。我试图手动添加函数来使其实现接口,但由于这只是一种hack,它会引起其他错误并且不可行。
此外,由于我在这里或其他地方找到的每个代码片段或库都执行的是完全相同的操作,因此似乎不太可能会注意到这样的更改。由于所有代码都是很多年前的,我能否假设在Win10中这根本行不通?
如果是这样,那么我如何才能完成我提到的这两件事?
1. 查找当前系统音量并 2. 设置当前应用程序每个附加硬件设备的音量?
我还尝试获取SndVol.exe的应用程序进程,并成功找到它(或者在未运行时打开它),但一旦我获得了混音器的句柄,我就不知道该怎么做了。是否可以通过Process类中提供的输入覆盖发送命令给应用程序?我对Process类完全没有经验,所以如果这个问题听起来很愚蠢,请原谅我。
编辑: 我的问题很简单:如何使用.NET更改“音量混合器”内的各个滑块。由于某些原因,人们将此解释为“如何使用Unity?”出于这个原因,我想以另一种方式提出我的问题,希望它听起来不那么“神秘”,而是更“普遍的使用情况”(希望如此)... :P
假设我想检测系统连接的音频设备并在我的应用程序中添加一个下拉列表,列出这些设备,如果我然后想为每个正在运行的应用程序添加音量滑块,以便我可以为该特定设备调整应用程序的音量,完全就像音量混合器所做的那样...我该如何实现?
更具体地说,我想知道的是如何将我的 滑块值应用于所选设备的各个应用程序的音量?

你正在编写什么类型的应用程序?Windows本机应用程序,UWP,.net core? - NineBerry
我正在Unity游戏引擎内编写一个针对Windows本地桌面的应用程序,仅限64位。这是一个高度专业化的应用程序,所有(我认为)艰难的部分基本上都完成了...只是这些看似简单的小事情使我们感到烦恼:(所以,再次回答您的问题:这是一个Windows Native 64位桌面应用程序。噢,完整的.NET(没有代码剥离)。 - JansenSensei
应用程序不应更改系统音量。如果(听起来像)您想在没有用户交互的情况下更改系统音量,这也非常危险。通过在没有用户交互的情况下增加系统音量,您可能会严重伤害戴耳机的人。 - NineBerry
我有点怀疑你的Unity应用程序是一个.NET Framework应用程序。根据我对Unity的了解,在Windows上它使用Mono或UWP,而不是.NET Framework。 - NineBerry
2个回答

2
你需要使用Win32 API来完成此操作。这里有更多信息。 此链接提供了相关的API文档。
SendMessage(this.Handle, WM_APPCOMMAND, IntPtr.Zero, value);

1
如果这个答案帮助您解决了问题,请将其标记为已接受的答案并点赞,谢谢! - Kieran Devlin
对于 SendMessage,您不需要进程句柄,而是需要窗口句柄。 - NineBerry
令我感到惊讶的是,我发现只要将Unity设置为构建32位应用程序,SendMessage就可以完美地工作。一旦你将其更改为64位应用程序,它又停止工作了。谁知道呢!:O 现在这个问题解决了,我们可以回到主线程中的问题了。Kieran的示例使用他自己的句柄调用音量上/下。我使用音量混合器和我的应用程序句柄。所有的调整都会影响系统音量。这是我在此之前已经能够设置的唯一事情。现在我有了一种新的方法来做到这一点,但我仍然不知道如何做我最初问的任何事情:( - JansenSensei
在 Windows 混音器中显示的应用程序音量与您通过 AudioListener.volume 在 Unity 中设置的音量相同。 - NineBerry
如果您这么说的话...但是,我要问同样的问题:在Update()期间,我如何将AudioListener.volume设置为1,但我仍然能够拍摄Unity音量不是100的屏幕截图?您是否是说Unity的audio__listener__类实际上应该覆盖用户手动使用滑块在Windows内更改音量?如果生活只是那么简单,你就会成为我的英雄!:D请允许我重新提出我的原始问题,以使其不那么晦涩:我想在我的应用程序中添加本机音量控制,以调整Windows音量混合器内的不同值。我该怎么做呢? - JansenSensei
显示剩余10条评论

0

https://github.com/naudio/NAudio

这个库包含了我需要的所有功能!它还包含一个演示,完全符合我在编辑原帖中发布的内容...让我可以访问每个音频设备,将其列在下拉菜单中,显示所选设备上每个单独应用程序的音量,并允许我最终获取音频音量(某种原因,直到现在似乎不可能)。

编译源代码真是一件麻烦的事情,因为你需要安装并更新FAKE,然后使用F#修复虚假安装程序,在每个步骤中下载依赖项...直到最后才能构建你需要构建的dlls来构建演示...但是下载二进制文件并将dll放入我的插件文件夹中效果很好! :D

使用演示源作为如何使用DLL的指南,从那里开始一切都会很顺利!


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