在Windows 7中获取当前系统卷

Cod*_*987 3 c# windows visual-c++

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

我在谷歌中查了一下,但每个解决方案都返回了值,-1无论4686346是否清楚地解释了它们的含义.

Cod*_*ray 9

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

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

CodeProject上有一个完整的托管包装库:Vista Core Audio API Master Volume Control.它可能实现了比您需要的功能更多的功能,但您可以了解从C#应用程序确定主系统卷需要执行的操作.

  • CodeProject链接已经死了. (6认同)

rog*_*ack 9

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

事实证明,有一些"标量"方法可以正常工作,并返回0到100之间的数字(使用getter和setter).

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

这里命令行构建它.

另见/sf/answers/528507731/


Sim*_*ier 6

由于您将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);
      }
  }
Run Code Online (Sandbox Code Playgroud)