在Windows 7中获取当前系统卷

时间:2011-01-09 15:56:27

标签: c# windows visual-c++

如何在Windows 7中获取系统的当前主音量?

我在Google上查了一下,但每个解决方案都返回了-14686346这样的值,而没有明确解释它们的含义。

3 个答案:

答案 0 :(得分:9)

好的,对于那些寻找命令行或C ++选项的人来说,这里有一些使用IAudioEndpointVolume API的源代码。

原来有“标量”方法可以正常工作,并返回0到100之间的数字(带有getter和setter)。

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

它的命令行构建here

另见https://stackoverflow.com/a/7550110/32453

答案 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);
      }
  }