Вы должны войти, чтобы создавать сообщения и темы.

Отключение микрофона через реестр

Всех приветствую!

Пожалуйста, помогите мне с реестром. Посмотрел видео Хачатура про реестр, однако все ровно не понимаю как отключить микрофон посредством реестра без всяких сторонних библиотек, как предлагают в гугле. Сама эта ветка, где можно отключить микрофон, имеет множество папок со странным наименованием, причем найти нужно параметр "Microphone", чтобы потом, выше уровнем, поменять параметр DeviceState. Возможно, я мыслю не так и можно сделать всё проще. Собственно, я бы хотел, чтоб добрые ребята с форума помогли с такой проблемой, написав код решения данной задачи. Например, создав проект Windows Forms, добавив button1, где будет событие нажатия, при котором отключается микрофон через реестр. Мне главное понять саму суть. Буду крайне благодарен, если кто поможет. Задайте уточняющие вопросы, если я неясно изложил проблему. Всем хорошего вечера =)

Привет. Это просто рабочий вариант из Гугла, со стека(не реестр), может пригодится.

Демо

Код. Отключает звук в текущем микрофоне

public partial class MainWindow : Window
   {
       public MainWindow()
       {
           InitializeComponent();

       }

       static bool myMute = false;
       private void Image_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
       {
           myMute = !myMute;

           Controller.EDataFlow dataFlow = Controller.EDataFlow.eCapture;
           Controller.ERole eRole = Controller.ERole.eCommunications;
           Controller.SetMute(dataFlow, eRole, myMute);
       }
   }

public class Controller
   {
       [ComImport]
       [Guid("BCDE0395-E52F-467C-8E3D-C4579291692E")]
       private class MMDeviceEnumerator
       {
       }
       [Guid("D666063F-1587-4E43-81F1-B948E807363F"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
       private interface IMMDevice
       {
           [PreserveSig]
           int Activate([MarshalAs(UnmanagedType.LPStruct)] Guid iid, int dwClsCtx, IntPtr pActivationParams, [MarshalAs(UnmanagedType.IUnknown)] out object ppInterface);
           void _VtblGap1_1();
           int GetId([MarshalAs(UnmanagedType.LPWStr)] out string strId);
       }
       [Guid("A95664D2-9614-4F35-A746-DE8DB63617E6"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
       private interface IMMDeviceEnumerator
       {
           void _VtblGap1_1();
           //void _VtblGap1_5(); /// (Alternative)
           [PreserveSig]
           int GetDefaultAudioEndpoint(EDataFlow dataFlow, ERole role, out IMMDevice ppDevice);
       }
       [Guid("5CDF2C82-841E-4546-9722-0CF74078229A"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
       private interface IAudioEndpointVolume
       {
       }
       [Guid("5CDF2C82-841E-4546-9722-0CF74078229A"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
       private interface ISetMute : IAudioEndpointVolume
       {
           void _VtblGap1_11();
           int SetMute([MarshalAs(UnmanagedType.Bool)] bool bMute, [MarshalAs(UnmanagedType.LPStruct)] Guid pguidEventContext);
       }
       private static IAudioEndpointVolume GetMMDeviceAudioEndpointVolume(EDataFlow dataFlow, ERole role)
       {
           IMMDeviceEnumerator MMDeviceEnumerator = (IMMDeviceEnumerator)(new MMDeviceEnumerator());
           MMDeviceEnumerator.GetDefaultAudioEndpoint(dataFlow, role, out IMMDevice MMDevice);
           MMDevice.Activate(typeof(IAudioEndpointVolume).GUID, 0, IntPtr.Zero, out object o);
           IAudioEndpointVolume AudioEndpointVolume = (IAudioEndpointVolume)o;

           Marshal.ReleaseComObject(MMDevice);
           Marshal.ReleaseComObject(MMDeviceEnumerator);

           return AudioEndpointVolume;
       }
       public static void SetMute(EDataFlow dataFlow, ERole role, bool mute)
       {
           ISetMute AudioEndpointVolume = (ISetMute)GetMMDeviceAudioEndpointVolume(dataFlow, role);
           AudioEndpointVolume.SetMute(mute, Guid.Empty);
           Marshal.ReleaseComObject(AudioEndpointVolume);
       }
       public enum EDataFlow { eRender, eCapture, eAll };
       public enum ERole { eConsole, eMultimedia, eCommunications };
   }

P.S. К сожалению я пока не настолько хорош, чтобы объяснить принципы работы.

Лайкнул Удаленный пользователь
Удаленный пользователь

Привет! Спасибо тебе за ответ, спасибо за помощь! В принципе да, не стоит создавать велосипед и пытаться как-то там что-то там самому через реестр. Оказывается (я не знал) есть уже встроенные функции для работы со звуком.

Как я выкрутился из ситуации, не дожидаясь ответа: я написал строчку для поиска и отключения службы Audiosrv. Микрофон отключается, однако отключаются и звук в системе.

Код:

Спойлер

using System.Linq;
using System.ServiceProcess;

var svc = ServiceController.GetServices().Single(x => x.ServiceName == "имя_службы");
svc.Stop();

Объявляем переменную, где через СкопированоServiceController получаем все службы и с помощью СкопированоLINQ выбираем одну, где СкопированоServiceName соответствует СкопированоAudiosrv. Далее отключаем эту службу методом СкопированоStop(). Соответственно, чтобы обратно включить звук, достаточно прописать Скопированоsvc.Start().