如何在C#中静音/取消静音特定的窗口?

3

我想知道是否可以仅静音一个特定的窗口。例如,我打开了Firefox和另外两个窗口。我想将与Firefox相关的所有声音都关闭,而不是整个电脑的声音。

这种情况可行吗?如果可以,应该怎样做?


你想编写一个类似于Windows 7音量管理器的C#应用程序吗? - Stefan P.
从未见过音量管理器,也不是我想要做的。 我编写了一个C#应用程序来隐藏/显示特定的窗口,因此我还想添加静音/取消静音特定窗口的选项。 - Ron
你想通过窗口(不太合理)还是进程进行静音?你使用Vista或更新版本的操作系统吗?Vista拥有重写的音频堆栈,允许每个进程控制音量。在XP上,您可能需要一些hackish的东西来实现每个进程的音量控制。 - CodesInChaos
2个回答

1

看,基本上,窗口句柄和代码中播放的声音之间没有任何关系...音频卡无法知道谁想要播放它。 理论上,在Web浏览器上有一个选项可以实现你想要的功能,但这并不容易,也不是100%可行。具体方法如下: 大多数从浏览器播放的音频都来自已知的对象,如wmp/quick time/vlc/flash等。 当用户选择在Firefox中静音所有音频时,你的应用程序将在Firefox选项卡中搜索这些已知对象,并使用它们的API进行静音/取消静音。 为了做到这一点,你需要编写一个Firefox扩展程序,以便从你的应用程序中访问选项卡内存。

顺便问一下,你用的是什么操作系统? 还有,看看这个:http://www.indev.no/?p=projects#flashmute(FlashMute),我相信它可以做到所说的——只针对Flash。


Rooek,感谢您的回复和提问。我计划发布支持所有Windows版本(XP、Vista和7)的程序。您搜索并静音音乐播放器的想法很好,但这不是我想要的。我宁愿放弃我的想法,也不想使用您的想法。无论如何,还是非常感谢您。CodeInChaos - 我想通过hwnd来静音,但如果不可能,那就用进程来实现。 - Ron

0

在Vista/Windows 7上: 我预计会有一些API可以基于进程来改变音量,这是音频管理器使用的。应该相对容易使用。

在XP上:
我认为没有内置功能可以实现你想要的功能。我建议在XP上不要提供该功能。但如果你真的想要,有一些hackish的解决方案:

  • 用户模式API挂钩。拦截音频API调用并使用自己的函数进行更改音量或操作音频信号以获得所需效果。您需要针对任何可用的音频API以不同方式执行此操作。我猜DirectSound和DirectShow特别麻烦。而且这需要将dll注入到您想要操作的任何进程中。而且这个dll最好不需要.net运行时。搜索IAT(导入地址表)或EAT(导出地址表)挂钩。
  • 内核模式音频挂钩。编写一个驱动程序,在内核中拦截音频并按进程进行更改。不知道如何做到这一点。

但正如你所看到的,这两种解决方案都不好。


好的,既然XP是问题所在,而且我希望程序在所有版本的Windows上都完全相同,那么我将放弃静音特定的进程/窗口的想法。谢谢你和其他试图帮助我的人。 - Ron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接