VolumeMixer 名称策略

VolumeMixer Name Policy

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

显然“0”processId 是系统声音

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

我无法理解如何选择使用 window 的名称或文件描述。例如,对于 Steam,它使用 "Steam Client Bootstrappeer",即使 Steam Window 打开(MainWindow Title 是 "Steam")。对于 spotify,始终使用 MainWindow Title 字段。

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

乱七八糟,前后矛盾。

有谁更准确地知道它是如何工作的?

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

终于可以得到一点满意的答复了

SndVol32.exe (VolumeMixer) 有点乱。基本功是:

  1. -如果 DisplayName 设置为随机选择 session 组(相同的分组参数)选择并显示 DisplayName。
  2. -如果不是,它会显示主window标题并正在侦听更改(有问题)。
  3. -如果没有 window (HWnd=0x0),它会显示进程的 MainModule 文件的 ProductName。

还有一件事!

这不适用于 UWP 应用程序。对于 UWP Apps sndvol 实现读取应用程序 Appxmanifest.xml 的 "DisplayName",即使是资源引用(示例 <DisplayName>ms-resource:......</DisplayName>

还有一件事!

SndVol32 监听 MainWindowTitle 更改(wineventhooks?winhooks?没关系)但不监听 windows 最小化到托盘或从托盘事件重新规范化(示例):

  • 如果您在打开 Spotify 的情况下打开 VolumeMixer window,它将显示歌曲的名称(主要window标题)。
  • 如果你关闭托盘,它会显示最后播放的歌曲的名称,但在你再次打开之前不会再改变 window
  • 如果您从托盘停止播放,它将只显示 "Spotify"(产品名称)。