Get the current system volume in Windows 7

2019-01-18 07:57发布

问题:

How can I get the current master volume of the system in Windows 7?

I looked up in Google, but every solution returned values like -1 or 4686346 without a clear explanation of what they mean.

回答1:

You're looking for the EndpointVolume API. This is part of the new audio APIs that were released in Windows Vista, and it can be used to get or set the master volume.

This undertaking is made considerably easier by the fact that you do not need to support versions of Windows prior to Vista (namely Windows XP), because there were substantial changes made to the relevant infrastructure between those OS releases. This is likely the reason why the existing samples you've tried didn't work properly.

There's a complete managed wrapper library available on CodeProject: Vista Core Audio API Master Volume Control. It probably implements more functionality than you need, but you can get an idea of what you need to do to determine the master system volume from your C# application.



回答2:

Ok, for those looking for a command line or C++ option, here's some source using the IAudioEndpointVolume API.

Turns out there is are "scalar" methods that work well, and returns a number from 0 to 100 (with getters and setters).

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

Command line build of it here.

See also possibly https://stackoverflow.com/a/7550110/32453



回答3:

Since you put C# as a tag, here is a small C# console app that gets it. It's based on the GetMasterVolumeLevelScalar method (Vista or higher).

The GetMasterVolumeLevelScalar method gets the master volume level of the audio stream that enters or leaves the audio endpoint device. The volume level is expressed as a normalized, audio-tapered value in the range from 0.0 to 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);
      }
  }