如何以编程方式更改非默认声音设备的音量? < >我可以用C++编程,使用 iDooEndoPositStult和>(< /代码>方法> ),在Windows上通过C++编程更改默认声音设备的音量级别。

如何以编程方式更改非默认声音设备的音量? < >我可以用C++编程,使用 iDooEndoPositStult和>(< /代码>方法> ),在Windows上通过C++编程更改默认声音设备的音量级别。,c++,winapi,audio,volume,C++,Winapi,Audio,Volume,如何在带有多个声卡的PC上更改非默认声音设备的音量水平?我解决了这个问题,这是我的代码: HRESULT hr = S_OK; IMMDeviceEnumerator *pEnumerator = NULL; IMMDeviceCollection *pCollection = NULL; IMMDevice *pEndpoint = NULL; IPropertyStore *pProps = NULL; LPWSTR pwszID = NULL; CoInitialize(NULL); h

如何在带有多个声卡的PC上更改非默认声音设备的音量水平?

我解决了这个问题,这是我的代码:

HRESULT hr = S_OK;
IMMDeviceEnumerator *pEnumerator = NULL;
IMMDeviceCollection *pCollection = NULL;
IMMDevice *pEndpoint = NULL;
IPropertyStore *pProps = NULL;
LPWSTR pwszID = NULL;
CoInitialize(NULL);

hr = CoCreateInstance(CLSID_MMDeviceEnumerator, NULL,CLSCTX_ALL, IID_IMMDeviceEnumerator,(void**)&pEnumerator);
hr = pEnumerator->EnumAudioEndpoints(eRender, DEVICE_STATE_ACTIVE,&pCollection); // ** use "eCapture" for microphones and "eRender" for speakers.
hr = pCollection->GetCount(&count);
if (count == 0){
   cout <<"No endpoints found."<<endl;
}
 for (ULONG i = 0; i < count; i++){
    hr = pCollection->Item(i, &pEndpoint);
    hr = pEndpoint->GetId(&pwszID);
    IAudioEndpointVolume *endpointVolume = NULL;
    pEnumerator->GetDevice(pwszID,&pEndpoint);
    pEndpoint->Activate(__uuidof(IAudioEndpointVolume),CLSCTX_INPROC_SERVER, NULL, (LPVOID *)&endpointVolume);
    hr = pEndpoint->OpenPropertyStore(STGM_READ, &pProps);
    PROPVARIANT varName;
    PropVariantInit(&varName);
    hr = pProps->GetValue(PKEY_Device_FriendlyName, &varName);
    printf("Endpoint %d: \"%S\" (%S)\n",i, varName.pwszVal, pwszID);
    CoTaskMemFree(pwszID);
    pwszID = NULL;
    PropVariantClear(&varName);
    endpointVolume->SetMasterVolumeLevelScalar(0.1, NULL); // set volume level of device to 0.1 (10%) 
   // endpointVolume->Release();
   //you can save endpointVolume in a container to set set volume level for each device.
}
HRESULT hr=S_正常;
IMMDeviceEnumerator*pEnumerator=NULL;
IMMDeviceCollection*pCollection=NULL;
IMMDevice*pEndpoint=NULL;
IPropertyStore*pProps=NULL;
LPWSTR pwszID=NULL;
共初始化(空);
hr=CoCreateInstance(CLSID\u MMDeviceEnumerator、NULL、CLSCTX\u ALL、IID\u IMMDeviceEnumerator、(void**)和pEnumerator);
hr=pEnumerator->EnumAudioEndpoints(eRender、设备状态、激活状态和pCollection);//**麦克风使用“eCapture”,扬声器使用“eRender”。
hr=pCollection->GetCount(&count);
如果(计数=0){
无法激活(uuu uuidof(IAudioEndpointVolume)、CLSCTX_uinproc_u服务器、NULL(LPVOID*)和endpointVolume);
hr=pEndpoint->OpenPropertyStore(STGM_读取和pProps);
原名;
普伐他汀(&varName);
hr=pProps->GetValue(PKEY\u Device\u FriendlyName和varName);
printf(“端点%d:\%S\”(%S)\n),i,varName.pwszVal,pwszID);
CoTaskMemFree(pwszID);
pwszID=NULL;
PropVariantClear(&varName);
endpointVolume->SetMasterVolumeLevelScalar(0.1,NULL);//将设备的卷级别设置为0.1(10%)
//endpointVolume->Release();
//您可以将endpointVolume保存在容器中,以便为每个设备设置卷级别。
}

这通常是个非常糟糕的主意,伙计。除非您正在编写驱动程序等,否则将管理音量级别的功能留给用户。是什么阻止您在
IAAudioEndpointVolume
界面上调用所需音频设备的
SetMasterVolumeLevel()
,我可以获得设备列表,但不知道如何从该列表中选择另一个声音设备来更改其音量。我尝试使用
IMMDeviceEnumerator
GetDevice()
方法选择它以获取非默认设备,但在执行时崩溃。