У меня есть приложение WPF, написанное на C#, которое использует микрофонное устройство с библиотеками naudio, которые в Windows 10 update build 1803 добавили настройку конфиденциальности для доступа к микрофону.
Если у пользователя установлен флаг конфиденциальности, мое приложение работает нормально, в противном случае мое приложение не работает. Итак, как я могу проверить эту настройку конфиденциальности с помощью C#?
Кажется, нет прямого способа выяснить, есть ли у вашего приложения эти разрешения, поэтому лучший вариант - попытаться получить доступ к микрофону и поймать ошибку, когда она возникает.
try
{
// code to access microphone
}
catch (System.UnauthorizedAccessException e)
{
// notify user application can't work without microphone permission
}
Насколько мне известно, это один из способов ее решения. К сожалению, он может обнаружить другие ошибки, не связанные с настройками конфиденциальности микрофона.
/// <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;
}
}
Вы можете сделать это, если у вас есть доступ к реестру, вероятно, потому что, вероятно, данные конфигурации для него хранятся там, но я бы не знал, есть ли у OP или нет в его обстоятельствах. Я предполагаю, что есть .NET API для работы с реестром и всегда P / Invoke для Win32 API. Вообще говоря, большинство данных конфигурации для подобных вещей хранится в реестре.