2010-11-20 56 views
3

我想知道是否可以静音只有一个特定的窗口。例如,我已经打开Firefox和两个窗口。我想将与Firefox相关的所有内容静音,但不是我电脑的全部声音。C#静音/取消静音特定窗口/ s?

这可能吗?如果是这样,该怎么办?

+0

你想写一个C#应用程序,就像Windows 7的卷管理器一样吗? – 2010-11-20 16:23:03

+0

永远不会看到卷管理器,它不完全是我想要做的。 我写了一个c#应用程序,隐藏/显示特定的窗口,所以我也想添加选项来静音/取消静音特定的窗口.. – Ron 2010-11-20 16:48:26

+0

你想通过窗口静音(没有多大意义)或按流程?你使用Vista还是更新? Vista有一个改写的audiostack,允许进行音量控制。在XP上,你可能需要一些骇客来获取每个进程音量控制。 – CodesInChaos 2010-11-20 17:57:52

回答

0

在Vista/Windows 7上: 我期望有一些API可以改变audiomanager使用的每个进程的音量。应该比较直接的使用。

对XP
我不认为有任何内置的功能,你想做什么。我建议不要在XP上提供该功能。但是,如果你真的想,有一些hackish解决方案:

  • Usermode API挂钩。用您自己的功能拦截对audioapis的调用。这些改变音量或操纵audiosignal,让你得到你想要的。您需要对几种可用的音频apis进行不同的处理。我认为DirectSound和DirectShow特别恼人。这需要将dll注入到任何要处理的进程中。这个DLL不需要.net运行时。搜索IAT(导入地址表)或EAT(导出地址表)挂钩。
  • 内核模式音频挂钩。编写一个驱动程序,拦截内核中的音频并根据每个进程更改音频。没有线索怎么做。

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

+0

好,因为XP是问题,我希望程序在所有版本的Windows上完全相同,我会放弃将特定进程/窗口静音的想法。谢谢你和那些试图帮助的人。 – Ron 2010-11-20 19:01:10

1

看起来,基本上,窗口句柄和其代码中正在播放的声音之间没有任何关系。音频卡无法分辨谁想要播放它。理论上,有一个选项可以在网络浏览器上做你想做的事情,但这并不容易,而不是100%。它是这样的: 从浏览器播放的大部分音频都来自已知的对象,如wmp/quick time/vlc/flash /等等。当用户选择将firefox中的所有音频静音时,您的应用程序将搜索那些firefox选项卡中的已知对象,并使用它们的api静音/取消静音。 为了做到这一点,你需要写一个扩展到Firefox,所以你可以从你的应用程序访问标签内存。

btw,what os? 并检查了这一点:http://www.indev.no/?p=projects#flashmute(flashmute)我相信它确实如此 - 仅适用于闪光灯。

+0

Rooek,感谢你的回复和你的问题,我计划发布我的程序,支持所有的Windows版本(XP,Vista和7)。你的想法搜索和静音音乐播放器很好,但这不是我想要的。我宁愿放弃我的想法,也不愿意使用我的想法。不管怎样,谢谢你。 CodeInChaos - 我想通过hwnd静音,但如果它不可能,那么是通过过程。 – Ron 2010-11-20 18:14:08