Windows XP 中的“按应用程序”混音器

Posted

技术标签:

【中文标题】Windows XP 中的“按应用程序”混音器【英文标题】:"Per Application" Audio Mixer in Windows XP 【发布时间】:2009-09-14 17:37:42 【问题描述】:

我需要在 Windows XP 中对来自其他进程的声音进行静音和取消静音。我正在寻找最佳策略。是否可以编写一个内核模式混合器来过滤输出设备的输入?我的另一种方法是为各种 API 设置 Hooks 以拦截它们的 Win32 调用。我更喜欢侵入性较小的方法。

一些注意事项: 涵盖使用 WinMM 和 DirectSound 系统组件的应用程序可能就足够了(即我不需要担心其他音频接口)。

这最终需要在 C# 应用程序中使用。我在互操作方面相当熟练,但没有 Win32 的内部知识来实现​​这一点。

可以列出所有需要静音的应用程序并分别处理每个应用程序,尽管该列表预计会增加。

附:万一有人担心,这些操作将在用户同意的情况下执行(没有黑幕)。

【问题讨论】:

我不认为你会找到任何简单的方法来做到这一点,而不编写一些非常低级的代码。 Windows API 根本不提供那种级别的灵活性。您应该仔细考虑此功能对您的重要性。 很遗憾,这不是可选功能。但我也绝对不怕写低级代码。 【参考方案1】:

内核模式驱动程序的问题在于它们通常不支持进程。这是干净的分层架构的一部分。处理进程是操作系统本身的责任。音频驱动程序应处理音频。现在,混音器肯定应该处理多个音频流,并且可能赋予它们不相等的权重,但它不应该特别关心来自哪里。此外,内置混音器并非设计为可更换的,因此您必须在混音前截取音频流。

因此,在 XP 上,使用 Microsoft Detours 拦截 API 级别的调用更有意义。您在那里有呼叫过程信息。 Detours 基本上将程序集注入到操作系统的用户模式部分,所以我建议使用 C++ 而不是 C# 和 Detours。

据我了解,在 Vista 上,audiostack 被重写,以便可以将音频流与应用程序相关联,但这是一个系统范围的功能。

【讨论】:

以上是关于Windows XP 中的“按应用程序”混音器的主要内容,如果未能解决你的问题,请参考以下文章

XP/Vista 的音量(平衡)控制

控制 Windows 音量

Vista 和 Windows 7 中的 OLEDB JET 错误,而不是 XP

Window 中的 Icon 属性使 Windows XP SP2 中的应用程序崩溃

Windows 音量控制 - 应用程序与设备

windows xp中的进程间通信