获取Windows 7中的当前系统卷

如何在Windows 7中获得系统的当前主卷?

我抬头看了一下Google,但是每个解决scheme都返回了像-14686346这样的值,但没有明确解释它们的含义。

Solutions Collecting From Web of "获取Windows 7中的当前系统卷"

您正在寻找EndpointVolume API 。 这是在Windows Vista中发布的新音频API的一部分,可用于获取或设置主音量。

由于您不需要在Vista之前支持Windows版本(即Windows XP),因此在这些操作系统版本之间对相关基础架构进行了实质性更改,因此这项工作变得相当容易。 这可能是您尝试的现有示例无法正常工作的原因。

在CodeProject上有一个完整的托管封装库: Vista核心音频API主音量控制 。 它可能会实现比您需要的功能更多的功能,但是您可以了解如何从C#应用程序确定主系统卷所需做的事情。

好的,对于那些正在寻找命令行或C ++选项的用户,下面是使用IAudioEndpointVolume API的一些源代码。

结果是有“标量”方法运作良好,并返回一个从0到100的数字(带有getter和setter)。

来源: https : //gist.github.com/rdp/8363580

命令行在这里构建。

另请参阅https://stackoverflow.com/a/7550110/32453

既然你把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); } }