Изменить громкость основного звука с XP на Windows 8 в C#
Мне нужен какой-то общий метод для изменения громкости основного звука с Windows XP на Windows 8 в C#, потому что мое приложение будет работать на этих ОС.
Я уже пробовал http://www.geekpedia.com/tutorial176_Get-and-set-the-wave-sound-volume.html но он не работает под Windows 8. Возможно, он должен работать под Windows XP.
В любом случае мне нужен совместимый подход, чтобы сделать это. Любая подсказка?
2 ответа
Поэтому мои решения - объединить 2 проекта:
Отключение / включение звука, изменение основного тома в Windows 7 x64 с помощью C#
http://www.geekpedia.com/tutorial176_Get-and-set-the-wave-sound-volume.html
Финальный код должен быть таким (используется платформа NAudio)
static class NativeMethods { [DllImport("winmm.dll", EntryPoint = "waveOutSetVolume")] public static extern int WaveOutSetVolume(IntPtr hwo, uint dwVolume); [DllImport("winmm.dll", SetLastError = true)] public static extern bool PlaySound(string pszSound, IntPtr hmod, uint fdwSound); } public static class MSWindowsFriendlyNames { public static string WindowsXP { get { return "Windows XP"; } } public static string WindowsVista { get { return "Windows Vista"; } } public static string Windows7 { get { return "Windows 7"; } } public static string Windows8 { get { return "Windows 8"; } } } public static class SistemVolumChanger { public static void SetVolume(int value) { if (value < 0) value = 0; if (value > 100) value = 100; var osFriendlyName = GetOSFriendlyName(); if (osFriendlyName.Contains(MSWindowsFriendlyNames.WindowsXP)) { SetVolumeForWIndowsXP(value); } else if (osFriendlyName.Contains(MSWindowsFriendlyNames.WindowsVista) || osFriendlyName.Contains(MSWindowsFriendlyNames.Windows7) || osFriendlyName.Contains(MSWindowsFriendlyNames.Windows8)) { SetVolumeForWIndowsVista78(value); } else { SetVolumeForWIndowsVista78(value); } } public static int GetVolume() { int result = 100; try { MMDeviceEnumerator DevEnum = new MMDeviceEnumerator(); MMDevice device = DevEnum.GetDefaultAudioEndpoint(EDataFlow.eRender, ERole.eMultimedia); result = (int)(device.AudioEndpointVolume.MasterVolumeLevelScalar * 100); } catch (Exception) { } return result; } private static void SetVolumeForWIndowsVista78(int value) { try { MMDeviceEnumerator DevEnum = new MMDeviceEnumerator(); MMDevice device = DevEnum.GetDefaultAudioEndpoint(EDataFlow.eRender, ERole.eMultimedia); device.AudioEndpointVolume.MasterVolumeLevelScalar = (float)value / 100.0f; } catch (Exception) { } } private static void SetVolumeForWIndowsXP(int value) { try { // Calculate the volume that's being set double newVolume = ushort.MaxValue * value / 10.0; uint v = ((uint)newVolume) & 0xffff; uint vAll = v | (v << 16); // Set the volume int retVal = NativeMethods.WaveOutSetVolume(IntPtr.Zero, vAll); } catch (Exception) { } } private static string GetOSFriendlyName() { string result = string.Empty; ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT Caption FROM Win32_OperatingSystem"); foreach (ManagementObject os in searcher.Get()) { result = os["Caption"].ToString(); break; } return result; } }
Обновление № 1. Год 2015 В основном он использует фреймворк NAudio. Поэтому в настоящее время некоторые методы и свойства NAudio имеют другие имена.
Например
eDataFlow.eRender теперь является DataFlow.Render
а также
eRole.eMultimedia - это роль. Мультимедиа
Для Windows 7+:
Есть некоторые проблемы с принятым ответом. Поскольку страница codeproject удалена, она теперь не имеет контекста.
Вам нужно получить NAudio от Nuget
Заменить первое на второе
MMDevice device = DevEnum.GetDefaultAudioEndpoint (EDataFlow.eRender, ERole.eMultimedia);
MMDevice device = DevEnum.GetDefaultAudioEndpoint ((DataFlow) 0, (Role) 1);
Просто быстрое предупреждение, если вы потерялись, пытаясь исправить ошибки с помощью принятого кода ответа.