代码之家  ›  专栏  ›  技术社区  ›  Ron

C静音/取消静音特定窗口?

  •  3
  • Ron  · 技术社区  · 15 年前

    我想知道是否可以只静音一个 具体的 窗口。例如,我打开了firefox,还有两个窗口。我想把所有与火狐相关的东西都静音,但不要把我电脑的声音全部静音。

    这有可能吗?如果是这样,怎么做?

    2 回复  |  直到 15 年前
        1
  •  0
  •   CodesInChaos    15 年前

    在Vista/Windows 7上: 我希望有一些API可以根据AudioManager使用的每个进程更改卷。应该是相对直接的使用。

    关于XP
    我认为没有任何内置的功能可以满足您的需要。我建议不要在XP上提供该功能。但如果你真的想,有一些黑客解决方案:

    • 用户模式API挂钩。用您自己的函数拦截对audioAPI的调用。这些改变音量或操作音频信号,这样你就能得到你想要的。对于几个可用的音频API中的任何一个,您都需要以不同的方式执行此操作。我想直接的声音和直接的表演特别烦人。这需要将一个dll注入到您想要操作的任何进程中。这个DLL最好不需要.NET运行时。搜索IAT(导入地址表)或EAT(导出地址表)挂钩。
    • 内核模式音频挂钩。编写一个驱动程序,它在内核中截取音频并根据每个进程对其进行更改。不知道怎么做。

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

        2
  •  1
  •   RoeeK    15 年前

    看,基本上,窗口手柄和它的代码中播放的声音之间没有任何关系。声卡无法分辨谁想让它播放。 理论上讲,在Web浏览器上有一个做你想做的事情的选项,但这并不容易,也不是100%。就像这样: 从浏览器播放的大多数音频来自已知对象,如wmp/quick time/vlc/flash/etc。 当用户选择从Firefox中静音所有音频时,您的应用程序将搜索Firefox选项卡中的已知对象,并使用其API将其静音/取消静音。 为了做到这一点,您需要为Firefox编写一个扩展,这样您就可以从应用程序访问Tabs内存。

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