Как отключить звуки глобально во всем моем приложении? - PullRequest
1 голос
/ 10 июля 2010

В моем приложении установлена ​​система плагинов, и я бы хотел, чтобы эти плагины не воспроизводили звуки.Это не должно быть идеальным решением, которое не может быть переопределено плагином.

РЕДАКТИРОВАТЬ: Звуки будут воспроизводиться через MediaElement в плагинах

Спасибо за ответ!

1 Ответ

2 голосов
/ 13 июля 2010

Отключить звуки во всех элементах 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 с использованием собственного кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...