我在我的應用程序中有一個插件系統,我想阻止這些插件播放聲音。它不一定是一個不能被插件重寫的完美解決方案。如何在整個應用程序中全局關閉聲音?
編輯:聲音將通過MediaElement在插件
播放謝謝回答!
我在我的應用程序中有一個插件系統,我想阻止這些插件播放聲音。它不一定是一個不能被插件重寫的完美解決方案。如何在整個應用程序中全局關閉聲音?
編輯:聲音將通過MediaElement在插件
播放謝謝回答!
禁用窗口中所有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調用。
非常感謝您的詳細解答! – 2010-07-13 16:13:08