如何在Windows 7中获取系统的当前主卷?我在谷歌上查了一下,但是每个解决方案都返回了像-1或4686346这样的值,而没有明确解释它们的含义。
-1
4686346
pkwftd7m1#
**您正在查找EndpointVolume API。**这是Windows Vista中发布的新音频API的一部分,可用于获取或设置主音量。
EndpointVolume
由于您不需要支持Vista之前的Windows版本(即Windows XP),这一任务变得相当容易,因为在这些操作系统版本之间对相关基础架构进行了重大更改。这可能是您尝试的现有示例无法正常工作的原因。CodeProject上有一个完整的托管 Package 库:Vista Core Audio API Master Volume Control。它实现的功能可能比您需要的更多,但您可以从C#应用程序中了解需要做些什么来确定主系统卷。
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); } }
字符串
de90aj5v3#
好了,对于那些寻找命令行或C++选项的人,这里有一些使用IAudioEndpointVolume API的源代码。事实证明,有一些“标量”方法工作得很好,并返回一个从0到100的数字(使用getter和setter)。来源:https://gist.github.com/rdp/8363580命令行构建here。另见https://stackoverflow.com/a/7550110/32453
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(¤tVolume); 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(); }
4条答案
按热度按时间pkwftd7m1#
**您正在查找
EndpointVolume
API。**这是Windows Vista中发布的新音频API的一部分,可用于获取或设置主音量。由于您不需要支持Vista之前的Windows版本(即Windows XP),这一任务变得相当容易,因为在这些操作系统版本之间对相关基础架构进行了重大更改。这可能是您尝试的现有示例无法正常工作的原因。
CodeProject上有一个完整的托管 Package 库:Vista Core Audio API Master Volume Control。它实现的功能可能比您需要的更多,但您可以从C#应用程序中了解需要做些什么来确定主系统卷。
3zwjbxry2#
既然你把C#作为一个标签,这里有一个小的C#控制台应用程序,它得到它。它基于GetMasterVolumeLevelScalar方法(Vista或更高版本)。
GetMasterVolumeLevelScalar方法获取进入或离开音频端点设备的音频流的主音量级别。音量级表示为0.0至1.0范围内的标准化音频锥形值。
字符串
de90aj5v3#
好了,对于那些寻找命令行或C++选项的人,这里有一些使用IAudioEndpointVolume API的源代码。
事实证明,有一些“标量”方法工作得很好,并返回一个从0到100的数字(使用getter和setter)。
来源:https://gist.github.com/rdp/8363580
命令行构建here。
另见https://stackoverflow.com/a/7550110/32453
wnvonmuf4#
您可以通过Windows Core Audio API获取和设置Windows音量
C++程序example:
字符串