gpt4 book ai didi

wpf - 如何在我的整个应用程序中全局关闭声音?

转载 作者:行者123 更新时间:2023-12-02 23:00:31 32 4
gpt4 key购买 nike

我的应用程序中有一个插件系统,我想阻止这些插件播放声音。它不一定是无法被插件覆盖的完美解决方案。

编辑:声音将通过 MediaElement 播放在插件中

感谢您的回答!

最佳答案

禁用窗口中所有 MediaElement 中的声音很容易。只需创建一个附加的继承属性,在它应用到的任何 MediaElement 上强制 IsMuted=false。该属性将像这样使用:

<Window my:Silencer.Silence="true" ...>
...
</Window>

以下是它的实现方式:
public class Silencer : DependencyObject
{
// Silence
public static bool GetSilence(DependencyObject obj) { return (bool)obj.GetValue(SilenceProperty); }
public static void SetSilence(DependencyObject obj, bool value) { obj.SetValue(SilenceProperty, value); }
public static readonly DependencyProperty SilenceProperty = DependencyProperty.RegisterAttached("Silence", typeof(bool), typeof(Silencer), new FrameworkPropertyMetadata
{
Inherits = true,
PropertyChangedCallback = (obj, e) =>
{
var element = obj as MediaElement; if(element==null) return;
if((bool)e.NewValue)
{
element.SetBinding(UnmuteDetectedProperty, new Binding("IsMuted") { RelativeSource = RelativeSource.Self });
element.IsMuted = true;
}
else
{
element.ClearValue(UnmuteDetectedProperty);
element.IsMuted = false;
}
}
});

// UnmuteDetected
public static readonly DependencyProperty UnmuteDetectedProperty = DependencyProperty.RegisterAttached("UnmuteDetected", typeof(bool), typeof(Silencer), new PropertyMetadata
{
PropertyChangedCallback = (obj, e) =>
{
((MediaElement)obj).IsMuted = GetSilence(obj);
}
});
}

工作原理:当 Silencer 在 Window 上设置为 true 时,所有后代都会收到属性更改通知。这包括已经在 Window 中或以后添加到 Window 中的任何 MediaElement。属性更改通知会导致 MediaElement 的 UnmuteDetected 属性绑定(bind)到 IsMuted,然后将 IsMuted 设置为 true。如果插件的代码设置 IsMuted=false,它将触发第二个 PropertyChangedCallback,它将再次设置为 true。

请注意,这仅适用于 MediaElement,并且仅适用于将它们添加到可视化树中的情况。

阻止的不仅仅是 MediaElement 声音

阻止应用程序中所有声音的更全面的方法是 Vista 的 core audio APIs (在 Windows 7 中也可用),特别是 ISimpleAudioVolume界面。这可以用来阻止应用程序产生音频的几乎所有方式,除了 PlaySound() 和其他将其输出路由到系统通知 Audio Session 的技术。阻止定向到系统通知 session 的声音需要使用 native 代码拦截 Windows 调用。

关于wpf - 如何在我的整个应用程序中全局关闭声音?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3218598/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com