我需要一些通用方法将主音频音量从Windows XP更改为Windows 8,因为我的应用程序将在这些操作系统上运行。
我已经尝试http://www.geekpedia.com/tutorial176_Get-and-set-the-wave-sound-volume.html但它在Windows 8下无法运行。也许它应该可以在Windows XP下运行。
无论如何,我需要一些兼容的方法来做到这一点。任何线索?
答案 0 :(得分:4)
所以我的解决方案是结合两个项目:
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是Role.Multimedia
答案 1 :(得分:1)
对于Windows 7 +:
接受的答案存在一些问题。因为删除了codeproject页面,所以它现在没有上下文。
你需要从Nuget
将第一个替换为第二个
MMDevice device = DevEnum.GetDefaultAudioEndpoint(EDataFlow.eRender,ERole.eMultimedia);
MMDevice device = DevEnum.GetDefaultAudioEndpoint((DataFlow)0,(角色)1);
如果您在尝试使用已接受的答案代码修复错误,那么请快速提醒。