Отключение микрофона через реестр
Цитата: --- НЛО --- от 07.11.2022, 19:19Всех приветствую!
Пожалуйста, помогите мне с реестром. Посмотрел видео Хачатура про реестр, однако все ровно не понимаю как отключить микрофон посредством реестра без всяких сторонних библиотек, как предлагают в гугле. Сама эта ветка, где можно отключить микрофон, имеет множество папок со странным наименованием, причем найти нужно параметр "Microphone", чтобы потом, выше уровнем, поменять параметр DeviceState. Возможно, я мыслю не так и можно сделать всё проще. Собственно, я бы хотел, чтоб добрые ребята с форума помогли с такой проблемой, написав код решения данной задачи. Например, создав проект Windows Forms, добавив button1, где будет событие нажатия, при котором отключается микрофон через реестр. Мне главное понять саму суть. Буду крайне благодарен, если кто поможет. Задайте уточняющие вопросы, если я неясно изложил проблему. Всем хорошего вечера =)
Всех приветствую!
Пожалуйста, помогите мне с реестром. Посмотрел видео Хачатура про реестр, однако все ровно не понимаю как отключить микрофон посредством реестра без всяких сторонних библиотек, как предлагают в гугле. Сама эта ветка, где можно отключить микрофон, имеет множество папок со странным наименованием, причем найти нужно параметр "Microphone", чтобы потом, выше уровнем, поменять параметр DeviceState. Возможно, я мыслю не так и можно сделать всё проще. Собственно, я бы хотел, чтоб добрые ребята с форума помогли с такой проблемой, написав код решения данной задачи. Например, создав проект Windows Forms, добавив button1, где будет событие нажатия, при котором отключается микрофон через реестр. Мне главное понять саму суть. Буду крайне благодарен, если кто поможет. Задайте уточняющие вопросы, если я неясно изложил проблему. Всем хорошего вечера =)
Цитата: Viсtor от 09.11.2022, 23:53Привет. Это просто рабочий вариант из Гугла, со стека(не реестр), может пригодится.
[spoiler title="Демо"][/spoiler]
[spoiler title="Код. Отключает звук в текущем микрофоне"]
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 }; }[/spoiler]
P.S. К сожалению я пока не настолько хорош, чтобы объяснить принципы работы.
Привет. Это просто рабочий вариант из Гугла, со стека(не реестр), может пригодится.

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. К сожалению я пока не настолько хорош, чтобы объяснить принципы работы.
Цитата: --- НЛО --- от 10.11.2022, 06:05Привет! Спасибо тебе за ответ, спасибо за помощь! В принципе да, не стоит создавать велосипед и пытаться как-то там что-то там самому через реестр. Оказывается (я не знал) есть уже встроенные функции для работы со звуком.
Как я выкрутился из ситуации, не дожидаясь ответа: я написал строчку для поиска и отключения службы [simple_tooltip content='Служба звука Windows. Полное название — Windows Audio']Audiosrv[/simple_tooltip]. Микрофон отключается, однако отключаются и звук в системе.
Код:
[spoiler title=""]
using System.Linq; using System.ServiceProcess; var svc = ServiceController.GetServices().Single(x => x.ServiceName == "имя_службы"); svc.Stop();[/spoiler]
Объявляем переменную, где через
ServiceControllerполучаем все службы и с помощьюLINQвыбираем одну, гдеServiceNameсоответствуетAudiosrv. Далее отключаем эту службу методомStop(). Соответственно, чтобы обратно включить звук, достаточно прописатьsvc.Start().
Привет! Спасибо тебе за ответ, спасибо за помощь! В принципе да, не стоит создавать велосипед и пытаться как-то там что-то там самому через реестр. Оказывается (я не знал) есть уже встроенные функции для работы со звуком.
Как я выкрутился из ситуации, не дожидаясь ответа: я написал строчку для поиска и отключения службы Audiosrv. Микрофон отключается, однако отключаются и звук в системе.
Код:
using System.Linq; using System.ServiceProcess; var svc = ServiceController.GetServices().Single(x => x.ServiceName == "имя_службы"); svc.Stop();
Объявляем переменную, где через СкопированоServiceController получаем все службы и с помощью СкопированоLINQ выбираем одну, где СкопированоServiceName соответствует СкопированоAudiosrv. Далее отключаем эту службу методом СкопированоStop(). Соответственно, чтобы обратно включить звук, достаточно прописать Скопированоsvc.Start().