c# - VolumeMixer 名称策略
问题描述
使用 WASAPI 后,我无法理解使用 sndvol32(音量混合器)显示进程名称的策略是什么。
显然“0” processId 是系统声音
然后,我可以获得一些提示: - 如果您在 AudioSession 中设置了 DisplayName,它将使用显示名称。- 如果不是,它使用窗口的名称或 exe 的 FileDescription 字段。
我无法理解如何选择使用窗口名称或文件描述。例如,对于 Steam,即使 Steam 窗口打开(主窗口标题为“Steam”),它也会使用“Steam 客户端引导程序”。对于 spotify 始终使用 MainWindow Title 字段。
还有一些其他问题,例如:系统应用程序(如屏幕键盘)何时使用清单文件中设置的名称。
是一团糟,如此不协调。
任何人都更确切地知道它是如何做的?
有关更多信息,我在 C# 中为所有 COM 接口系列使用我自己的自定义包装器(类似于 NAudio 和其他人,但我不想自己构建它来学习)
解决方案
最后我会得到一个有点满意的答案。
SndVol32.exe (VolumeMixer) 有点乱。基本工作是:
- - 如果在组的随机选择会话中设置了 DisplayName(相同的分组参数),则选择并显示 DisplayName。
- - 如果没有,它会显示主窗口标题并正在监听更改(有问题)。
- - 如果没有窗口 (HWnd=0x0),它会显示进程的 MainModule 文件的 ProductName。
还有一件事!
这不适用于 UWP 应用。对于 UWP Apps sndvol 实现读取 App 的 Appxmanifest.xml 的“DisplayName”,即使是资源引用(示例<DisplayName>ms-resource:......</DisplayName>
)
还有一件事!
SndVol32 监听 MainWindowTitle 更改(wineventhooks?winhooks?没关系)但不监听最小化到托盘或从托盘事件重新规范化的窗口(示例):
- 如果您在打开 Spotify 的情况下打开 VolumeMixer 窗口,它将显示歌曲的名称(主窗口标题)。
- 如果您关闭托盘,它将显示最后播放的歌曲的名称,但在您再次打开窗口之前不会再次更改
- 如果您从托盘停止播放,它将仅显示“Spotify”(产品名称)。
推荐阅读
- node.js - 如何在 browserstack 中找到当前可用于测试的移动设备
- c# - 如何在字节数组C#中转换具有随机长度的字符串
- python - UnboundLocalError:分配前引用的局部变量“ehp”
- c# - “缺少 using 指令或程序集引用?” 尝试发布时出错
- html - 如何在页面加载之前使用 NODE 更改一些 HTML?
- python - Python - 用于 dict 键/值的变量名称/值
- podman - 如何在 podman 中共享图像?
- typescript - Typescript:如果设置了其他可选类型,则需要设置类型
- android - 如何使用android中的联系人号码以编程方式删除本机联系人?
- c++ - OpenMP 团队减少行为