获取Windows 7中的当前系统卷

qxsslcnc  于 2023-08-07  发布在  Windows
关注(0)|答案(4)|浏览(135)

如何在Windows 7中获取系统的当前主卷?
我在谷歌上查了一下,但是每个解决方案都返回了像-14686346这样的值,而没有明确解释它们的含义。

pkwftd7m

pkwftd7m1#

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

由于您不需要支持Vista之前的Windows版本(即Windows XP),这一任务变得相当容易,因为在这些操作系统版本之间对相关基础架构进行了重大更改。这可能是您尝试的现有示例无法正常工作的原因。
CodeProject上有一个完整的托管 Package 库:Vista Core Audio API Master Volume Control。它实现的功能可能比您需要的更多,但您可以从C#应用程序中了解需要做些什么来确定主系统卷。

3zwjbxry

3zwjbxry2#

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

字符串

de90aj5v

de90aj5v3#

好了,对于那些寻找命令行或C++选项的人,这里有一些使用IAudioEndpointVolume API的源代码。
事实证明,有一些“标量”方法工作得很好,并返回一个从0到100的数字(使用getter和setter)。
来源:https://gist.github.com/rdp/8363580
命令行构建here
另见https://stackoverflow.com/a/7550110/32453

wnvonmuf

wnvonmuf4#

您可以通过Windows Core Audio API获取和设置Windows音量
C++程序example

#include <cstdio>
#include <Windows.h>
#include <MMDeviceAPI.h>
#include <EndpointVolume.h>

int main(int argc, char* argv[])
{
    // Initialize the COM library
    CoInitialize(NULL);  

    IMMDeviceEnumerator* pEnumerator;
    IMMDevice* pDevice;
    IAudioEndpointVolume* pEndpointVolume;

    // Create a device enumerator
    CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_ALL, __uuidof(IMMDeviceEnumerator), (void**)&pEnumerator);

    // Get the default audio endpoint device
    pEnumerator->GetDefaultAudioEndpoint(eRender, eConsole, &pDevice);

    // Activate the IAudioEndpointVolume interface
    pDevice->Activate(__uuidof(IAudioEndpointVolume), CLSCTX_ALL, NULL, (void**)&pEndpointVolume);

    if ( argc == 1 ) {
        // Get the master volume level
        float currentVolume;
        pEndpointVolume->GetMasterVolumeLevelScalar(&currentVolume);
        printf("Current sound volume: %.1f\n\n", currentVolume);
    }

    if ( argc == 2 ) {
        float volume = strtof(argv[1], NULL);
        // Verify valid input range 0~1
        if ( ! ( 0.f <= volume && volume <= 1.f ) )
            return 1;
        pEndpointVolume->SetMasterVolumeLevelScalar(volume, NULL);
    }

    CoUninitialize();
}

字符串

相关问题