VolumeMixer名称策略

时间:2018-07-23 19:49:14

标签: c# audio volume wasapi

使用WASAPI后,我无法理解使用sndvol32(卷混合器)显示进程名称的策略是什么。

显然“ 0” processId是系统声音

然后,我可以获得一些提示: -如果您在AudioSession中设置了DisplayName,则它将使用显示名。 -如果不是,则使用窗口名称或exe的FileDescription字段。

我无法理解如何选择使用窗口名称或文件描述。例如,对于Steam,即使打开Steam窗口(其MainWindow标题为“ Steam”),它也会使用“ Steam Client Bootstrappeer”。对于Spotify,请始终使用MainWindow标题字段。

还有其他一些问题,例如:当系统应用程序(如屏幕键盘)使用清单文件中设置的名称时。

一团糟,太不一致了。

任何人都更确切地知道它是怎么做的?

有关更多信息,我在c#中为所有COM接口家族使用了自己的自定义包装器(类似于NAudio,但我不想自己构建它来学习)

1 个答案:

答案 0 :(得分:0)

最后我会得到一个令人满意的答案。

SndVol32.exe(VolumeMixer)有点混乱。基本工作是:

  1. -如果在组的随机选择的会话中设置了DisplayName(相同的分组参数),则会显示DisplayName。
  2. -如果没有显示,则显示主窗口标题并正在侦听更改(有问题)。
  3. -如果没有窗口(HWnd = 0x0),则会显示该进程的MainModule文件的ProductName。

还有一件事!

这不适用于UWP Apps。对于UWP Apps,sndvol可以读取App的Appxmanifest.xml的“ DisplayName”,即使是资源引用(例如<DisplayName>ms-resource:......</DisplayName>

还有一件事!

SndVol32侦听MainWindowTitle的更改(wineventhooks?winhooks?没关系),但不侦听最小化到托盘或从托盘事件重新标准化的窗口(例如):

  • 如果在打开Spotify的情况下打开VolumeMixer窗口,它将显示歌曲的名称(主窗口标题)。
  • 如果您靠近托盘,它将显示最后播放的歌曲的名称,但是直到您再次打开窗口时,它才会再次更改
  • 如果您从托盘中停止播放,则只会显示“ Spotify”(产品名称)。