主要使用Window API获取系统音量大小。
#include <Windows.h>
#include <mmdeviceapi.h>
#include <endpointvolume.h>
#include <iostream>
bool getAudioStatus(int* volume, bool* muted)
{
const CLSID CLSID_MMDeviceEnumerator = __uuidof(MMDeviceEnumerator);
const IID IID_IMMDeviceEnumerator = __uuidof(IMMDeviceEnumerator);
const IID IID_IAudioEndpointVolume = __uuidof(IAudioEndpointVolume);
IMMDeviceEnumerator* pEnumerator = nullptr;
IMMDeviceCollection* pCollection = nullptr;
IMMDevice* pDevice = nullptr;
IAudioEndpointVolume* pAudioEndpointVolume = nullptr;
UINT DeviceCounts;
DWORD pdwState;
LPWSTR strid = nullptr;
//初始化当前线程上的 COM 库,并将并发模型标识为单线程单元 (STA).必须调用此函数
HRESULT hr = CoInitialize(NULL);
if (FAILED(hr))
{
return false;
}
//创建并默认初始化与指定 CLSID 关联的类的单个对象。
hr = CoCreateInstance(CLSID_MMDeviceEnumerator, NULL,CLSCTX_ALL, IID_IMMDeviceEnumerator,(void**)&pEnumerator);
if (FAILED(hr))
{
return false;
}
//生成满足指定条件的音频终结点设备的集合
pEnumerator->EnumAudioEndpoints(eRender, DEVICE_STATE_ACTIVE, &pCollection);
pCollection->GetCount(&DeviceCounts);
for (int count = 0; count < DeviceCounts; count++)
{
pCollection->Item(count, &pDevice);
pDevice->GetState(&pdwState);
//音频终结点设备处于活动状态
if (pdwState == DEVICE_STATE_ACTIVE)
{
pDevice->GetId(&strid);
pDevice->Activate(IID_IAudioEndpointVolume, CLSCTX_ALL, NULL, (void**)&pAudioEndpointVolume);
float level;
BOOL Muted;
pAudioEndpointVolume->GetMasterVolumeLevelScalar(&level);
pAudioEndpointVolume->GetMute(&Muted);
*volume = (int)(level * 100);
*muted = (bool)Muted;
pDevice->Release();
pAudioEndpointVolume->Release();
break;
}
}
//释放资源
pEnumerator->Release();
pCollection->Release();
//记得释放
CoUninitialize();
}
int main()
{
int volume;
bool muted;
getAudioStatus(&volume, &muted);
std::cout << "volume:" << volume << " muted:" << muted;
return 0;
}
参考:
https://learn.microsoft.com/zh-cn/windows/win32/api/mmdeviceapi/nn-mmdeviceapi-immdeviceenumerator