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

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

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

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
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;
  }
}

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