2010-07-10 41 views

回答

2

禁用窗口中所有MediaElements中的声音很容易。只需创建一个附加的继承属性,该属性在它应用于的任何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); 
     } 
    }); 
} 

工作原理:当消声器被设置为true的窗口,所有后代获取属性变化通知。这包括已经在窗口中或稍后添加到窗口中的任何MediaElement。属性更改通知会将MediaElement的UnmuteDetected属性绑定到IsMuted,然后将IsMuted设置为true。如果插件的代码设置为IsMuted = false,则会触发第二个PropertyChangedCallback,它将再次将其设置为true。

请注意,这仅适用于MediaElements,并且仅在将它们添加到可视化树中时才适用。

阻断不仅仅是MediaElement的声音

从您的应用程序阻止所有声音的更全面的方法是Vista的core audio APIs(在Windows 7中也有),特别是ISimpleAudioVolume接口。除PlaySound()和其他将输出路由到系统通知音频会话的技术外,这可用于阻止应用程序产生音频的几乎所有方式。阻止指向系统通知会话的声音需要使用本机代码拦截Windows调用。

+0

非常感谢您的详细解答! – 2010-07-13 16:13:08

相关问题