Отключить звуки во всех элементах Media в окне очень просто. Просто создайте вложенное унаследованное свойство, которое применяет IsMuted = false для любого MediaElement, к которому он применяется. Свойство будет использоваться так:
<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 установлено значение true в окне, все потомки получают уведомление об изменении свойства. Это включает в себя любой MediaElement, который уже находится в окне или позже добавлен в окно. Из-за уведомления об изменении свойства свойство MediaElement UnmuteDetected привязывается к IsMuted, а для IsMuted устанавливается значение true. Если код плагина устанавливает IsMuted = false, он вызовет второй PropertyChangedCallback, который снова вернет ему значение true.
Обратите внимание, что это работает только для MediaElements и только если они добавлены в визуальное дерево.
Блокирование не только звуков MediaElement
Более всеобъемлющим методом блокировки всего звука из вашего приложения является базовый аудио API для Vista (также доступен в Windows 7), в частности интерфейс ISimpleAudioVolume . Это может использоваться для блокировки практически всех способов, которыми приложение может воспроизводить звук, за исключением PlaySound () и других методов, которые направляют их вывод в аудиосеанс системного уведомления. Для блокировки звука, направляемого на сеанс системных уведомлений, требуется перехват вызовов Windows с использованием собственного кода.