C# 获取当前系统卷(Windows 10)

C# 获取当前系统卷(Windows 10),c#,.net,windows,volume,C#,.net,Windows,Volume,我想找到当前系统音量,并在音量混合器中设置我的应用程序的音量,但似乎我找到的所有内容都是: 可以更改系统卷(已排序一个问题) 无法更改应用程序卷 或者根本不起作用 到目前为止,没有任何东西能够获取系统音量 我们目前正在使用nircmd设置全局卷,这非常有效,但它似乎没有获取当前卷的选项,因此我们可以稍后将卷恢复到原来的状态。至于设置应用程序本身的值,而不是全局卷,我一直在寻找我能找到的每一个线程,并且所有的东西(在这里以及其他地方)都将我带入C++文档或那个库周围的C包装,但该代码根本不起作

我想找到当前系统音量,并在音量混合器中设置我的应用程序的音量,但似乎我找到的所有内容都是:

  • 可以更改系统卷(已排序一个问题)
  • 无法更改应用程序卷
  • 或者根本不起作用
  • 到目前为止,没有任何东西能够获取系统音量
我们目前正在使用nircmd设置全局卷,这非常有效,但它似乎没有获取当前卷的选项,因此我们可以稍后将卷恢复到原来的状态。至于设置应用程序本身的值,而不是全局卷,我一直在寻找我能找到的每一个线程,并且所有的东西(在这里以及其他地方)都将我带入C++文档或那个库周围的C包装,但该代码根本不起作用,因为在每个函数的根上都是无效的。p> 下面是stackoverflow上的一个代码中断示例:

我找到的所有这些libs/代码示例都在某个时候执行此操作:

private static ISimpleAudioVolume GetVolumeObject(int pid)
   {
       IMMDeviceEnumerator deviceEnumerator = 
       (IMMDeviceEnumerator)(new MMDeviceEnumerator());
这会导致无效的强制转换问题,原因如下:

internal class MMDeviceEnumerator
{
}
internal interface IMMDeviceEnumerator
{
}
它试图转换到的类没有实现接口,因此转换显然无效。我试图手动添加函数,使其实现接口,但由于这只是一个简单的黑客攻击,它会导致其他错误,是不可行的选择

此外,由于我在这里或其他地方找到的每一个代码片段或库都做了完全相同的事情,所以这样的更改似乎不太可能被忽视。因为所有的代码都有很多年的历史了,我能假设这在Win10中根本不起作用吗

如果是的话,那我该怎么做我提到的那两件事呢

  • 查找当前系统卷和
  • 是否为每个连接的硬件设备设置当前应用程序的卷
我还尝试获取SndVol.exe的应用程序进程,并成功找到它(如果它没有运行,也可以打开它),但一旦我有了混音器的句柄,我就不知道该如何处理它了。是否可以通过Process类提供的输入覆盖向应用程序发送命令?我对过程类完全没有经验,所以如果这个问题听起来很愚蠢,请原谅我

编辑: 我的问题很简单:如何使用.NET更改混音器中的各个滑块。出于某种原因,人们把它解读为“如何使用统一?”。出于这个原因,我想以另一种方式提出我的问题,希望它听起来不那么“神秘的魔力”,而更像“通用用例”(希望)P

假设我想检测系统连接的音频设备,并在我的应用程序中添加一个下拉列表,列出这些设备,如果我想为每个正在运行的应用程序添加一个音量滑块,这样我就可以从我自己的应用程序中为该特定设备调整应用程序的音量,就像音量混合器一样。。。我将如何着手实施这一点


更具体地说,我想知道的是如何将滑块值应用于所选设备的单个应用程序的卷?

您需要使用Win32 API来完成此操作。

这个库包含了我需要的所有功能!它还包含一个演示,完全符合我在编辑的原始帖子中发布的内容。。。允许我访问每个音频设备,在下拉列表中列出,显示所选设备的每个应用程序的音量,并允许我最终获得音频音量(到目前为止,由于某些原因,这似乎是不可能的)

编译源代码是一件非常痛苦的事情,因为在修复假安装程序之前,您需要先安装然后更新假安装程序,然后再使用F#(我不知道)下载每一步的依赖项。。。在您最终构建构建演示所需的DLL之前。。。但是下载二进制文件并将dll放在我的插件文件夹中效果很好D


使用演示源代码作为如何使用DLL的指南,从那里一切顺利

你在写什么类型的申请?Windows Native、UWP、.net core?我正在Unity游戏引擎中编写一个应用程序,仅针对Windows Native桌面,64位。这是一个高度专业化的应用程序,所有(我认为是)困难的部分基本上都完成了。。。正是这些看似简单的小事让我们感到悲伤:(那么,再次回答你的问题:这是一个Windows原生64位桌面应用程序。哦,完整的.NET(无代码剥离)应用程序不应该改变系统音量。如果你想在没有用户交互的情况下更改系统音量。如果在没有用户交互的情况下增加系统音量,可能会严重伤害戴耳机的人。我有点怀疑你的unity应用程序是否是.Net Framework应用程序。据我所知,unity在Windows上使用的是Mono或UWP,而不是.Net Framework。它真的可以吗有那么简单吗?:O立即查看!非常感谢您的快速回复!如果答案帮助您解决了问题,请您将其标记为已接受的答案并进行投票表决。我看了一下,但不幸的是,这太好了,不可能是真的(首先,它只显示了如何将主音量调高/调低/静音。我已经可以这样做了。我需要找到当前主音量并在混音器内设置应用程序的音量,但此blackwasp链接仅显示“基本音量控制”不过,最大的问题是,当我从BlackWasp复制粘贴代码时,我没有收到任何错误…但我也看不到音量有任何变化。该死。太接近了!你用什么来做手柄?它不可能是控制台手柄nt通过这样的API发送消息。如果你使用unity,你可以从
SendMessage(this.Handle, WM_APPCOMMAND, IntPtr.Zero, value);