Проверьте настройку конфиденциальности микрофона в wpf

У меня есть приложение WPF, написанное на C#, которое использует микрофонное устройство с библиотеками naudio, которые в Windows 10 update build 1803 добавили настройку конфиденциальности для доступа к микрофону.

Если у пользователя установлен флаг конфиденциальности, мое приложение работает нормально, в противном случае мое приложение не работает. Итак, как я могу проверить эту настройку конфиденциальности с помощью C#?

1
0
560
2

Ответы 2

Кажется, нет прямого способа выяснить, есть ли у вашего приложения эти разрешения, поэтому лучший вариант - попытаться получить доступ к микрофону и поймать ошибку, когда она возникает.

try
{
// code to access microphone
}
catch (System.UnauthorizedAccessException e)
{
// notify user application can't work without microphone permission                
}

Вы можете сделать это, если у вас есть доступ к реестру, вероятно, потому что, вероятно, данные конфигурации для него хранятся там, но я бы не знал, есть ли у OP или нет в его обстоятельствах. Я предполагаю, что есть .NET API для работы с реестром и всегда P / Invoke для Win32 API. Вообще говоря, большинство данных конфигурации для подобных вещей хранится в реестре.

ImmortaleVBR 10.08.2018 23:39

Насколько мне известно, это один из способов ее решения. К сожалению, он может обнаружить другие ошибки, не связанные с настройками конфиденциальности микрофона.

/// <summary>
/// With Windows 10 update 1803 came an option to deny access to the microphones on an OS level.
/// The option covers all soundcards installed into the PC (Magnum/Callisto is a soundcard)
/// </summary>
public static class MicrophonePrivacyProbe
{
  /// <summary>
  /// Test if Microphone Privacy Settings are to restrictive for microphone access.
  /// </summary>
  /// <returns>True if microphone is accessible</returns>
  public static bool Allowed()
  {
    bool access = false;
    var devices = new CaptureDevicesCollection();

    if ( devices?.Count <= 0 ) return false;

    var captureDevice = new Capture(devices[0].DriverGuid);
    CaptureBuffer applicationBuffer = null;

    var inputFormat = new WaveFormat();
    inputFormat.AverageBytesPerSecond = 8000;
    inputFormat.BitsPerSample = 8;
    inputFormat.BlockAlign = 1;
    inputFormat.Channels = 1;
    inputFormat.FormatTag = WaveFormatTag.Pcm;
    inputFormat.SamplesPerSecond = 8000;

    CaptureBufferDescription bufferdesc = new CaptureBufferDescription();
    bufferdesc.BufferBytes = 200;
    bufferdesc.Format = inputFormat; 

    try
    {
      applicationBuffer = new CaptureBuffer(bufferdesc, captureDevice);
      access = true;
    }
    catch (SoundException e)
    {
    }
    finally
    {
      applicationBuffer?.Dispose();
      captureDevice?.Dispose();
    }

    return access;
  }
}

Другие вопросы по теме