如何在Windows 7中获取系统的当前主音量?
我在Google上查了一下,但每个解决方案都返回了-1
或4686346
这样的值,而没有明确解释它们的含义。
答案 0 :(得分:9)
好的,对于那些寻找命令行或C ++选项的人来说,这里有一些使用IAudioEndpointVolume API的源代码。
原来有“标量”方法可以正常工作,并返回0到100之间的数字(带有getter和setter)。
源: https://gist.github.com/rdp/8363580
它的命令行构建here。
答案 1 :(得分:8)
您正在寻找EndpointVolume
API。这是Windows Vista中发布的新音频API的一部分,可用于获取或设置主音量。
由于您不需要在Vista之前支持Windows版本(即Windows XP),因此在这些操作系统版本之间对相关基础架构进行了重大更改,因此这项工作变得相当容易。这可能是您尝试过的现有样品无法正常工作的原因。
CodeProject上有一个完整的托管包装库:Vista Core Audio API Master Volume Control。它可能实现了比您需要的功能更多的功能,但是您可以了解从C#应用程序确定主系统卷需要执行的操作。
答案 2 :(得分:4)
由于您将C#作为标记,因此这是一个获得它的小型C#控制台应用程序。它基于GetMasterVolumeLevelScalar方法(Vista或更高版本)。
GetMasterVolumeLevelScalar方法获取主音量级别 进入或离开音频端点设备的音频流。该 音量水平表示为标准化的音频锥形值 范围从0.0到1.0。
class Program
{
static void Main(string[] args)
{
Console.WriteLine(VolumeUtilities.GetMasterVolume());
}
}
public static class VolumeUtilities
{
public static float GetMasterVolume()
{
// get the speakers (1st render + multimedia) device
IMMDeviceEnumerator deviceEnumerator = (IMMDeviceEnumerator)(new MMDeviceEnumerator());
IMMDevice speakers;
const int eRender = 0;
const int eMultimedia = 1;
deviceEnumerator.GetDefaultAudioEndpoint(eRender, eMultimedia, out speakers);
object o;
speakers.Activate(typeof(IAudioEndpointVolume).GUID, 0, IntPtr.Zero, out o);
IAudioEndpointVolume aepv = (IAudioEndpointVolume)o;
float volume = aepv.GetMasterVolumeLevelScalar();
Marshal.ReleaseComObject(aepv);
Marshal.ReleaseComObject(speakers);
Marshal.ReleaseComObject(deviceEnumerator);
return volume;
}
[ComImport]
[Guid("BCDE0395-E52F-467C-8E3D-C4579291692E")]
private class MMDeviceEnumerator
{
}
[Guid("5CDF2C82-841E-4546-9722-0CF74078229A"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
private interface IAudioEndpointVolume
{
void _VtblGap1_6();
float GetMasterVolumeLevelScalar();
}
[Guid("A95664D2-9614-4F35-A746-DE8DB63617E6"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
private interface IMMDeviceEnumerator
{
void _VtblGap1_1();
[PreserveSig]
int GetDefaultAudioEndpoint(int dataFlow, int role, out IMMDevice ppDevice);
}
[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);
}
}