代码如下:
- BOOL SetCurrentProcessVolume(DWORD dwVolume,BOOL IsMixer/*TRUE*/)
- {
- HRESULT hr <span style="white-space:pre"> </span>= S_OK;
- IMMDeviceCollection *pMultiDevice = NULL;
- IMMDevice *pDevice = NULL;
- IAudioSessionEnumerator *pSessionEnum = NULL;
- IAudioSessionManager2 *pASManager = NULL;
- IMMDeviceEnumerator *m_pEnumerator = NULL;
- const IID IID_ISimpleAudioVolume = __uuidof(ISimpleAudioVolume);
- const IID IID_IAudioSessionControl2 = __uuidof(IAudioSessionControl2);
- CoInitialize(NULL);
- hr = CoCreateGuid(&m_guidMyContext);
- if(FAILED(hr))
- return FALSE;
- // Get enumerator for audio endpoint devices.
- hr = CoCreateInstance(__uuidof(MMDeviceEnumerator),
- NULL, CLSCTX_ALL,
- __uuidof(IMMDeviceEnumerator),
- (void**)&m_pEnumerator);
- if(FAILED(hr))
- return FALSE;
- if (IsMixer)
- {
- hr = m_pEnumerator->EnumAudioEndpoints(eRender,DEVICE_STATE_ACTIVE, &pMultiDevice);
- }
- else
- {
- hr = m_pEnumerator->EnumAudioEndpoints(eCapture,DEVICE_STATE_ACTIVE, &pMultiDevice);
- }
- if(FAILED(hr))
- return FALSE;
- UINT deviceCount = 0;
- hr = pMultiDevice->GetCount(&deviceCount);
- if(FAILED(hr))
- return FALSE;
- if((int)dwVolume < 0)
- dwVolume = 0;
- if((int)dwVolume > 100)
- dwVolume = 100;
- for (UINT ii=0; ii<deviceCount; ii++)
- {
- pDevice = NULL;
- hr = pMultiDevice->Item(ii,&pDevice);
- if(FAILED(hr))
- return FALSE;
- hr = pDevice->Activate(__uuidof(IAudioSessionManager),CLSCTX_ALL, NULL,(void**)&pASManager);
- if(FAILED(hr))
- return FALSE;
- hr = pASManager->GetSessionEnumerator(&pSessionEnum);
- if(FAILED(hr))
- return FALSE;
- int nCount;
- hr = pSessionEnum->GetCount(&nCount);
- for (int i = 0; i < nCount; i++)
- {
- IAudioSessionControl *pSessionCtrl;
- hr = pSessionEnum->GetSession(i, &pSessionCtrl);
- if (FAILED(hr))
- continue;
- IAudioSessionControl2 *pSessionCtrl2;
- hr = pSessionCtrl->QueryInterface(IID_IAudioSessionControl2, (void **)&pSessionCtrl2);
- if(FAILED(hr))
- continue;
- ULONG pid;
- hr = pSessionCtrl2->GetProcessId(&pid);
- if (FAILED(hr))
- continue;
- ISimpleAudioVolume *pSimplevol;
- hr = pSessionCtrl2->QueryInterface(IID_ISimpleAudioVolume, (void **)&pSimplevol);
- if (FAILED(hr))
- continue;
- if (pid == GetCurrentProcessId())
- {
- pSimplevol->SetMasterVolume((float)dwVolume/100, NULL);
- }
- else
- {
- pSimplevol->SetMasterVolume((float)0/100, NULL);
- }
- }
- }
- SAFE_RELEASE(m_pEnumerator);
- return TRUE;
- }
1.IMMDeviceEnumerator::EnumAudioEndpoints
EnumAudioEndpoints 方法用于生成符合指定标准的终端设备的一个合集。
第一个参数为枚举值,包括以下三个:
eRender:音频渲染流,从应用程序到设备终端的流。设置为eRender,获取播放设备。
eCapture:音频捕捉流,从设备终端到应用程序的流。设置为eCapture,获取录音设备。
eAll:获取以上两种。
第二个参数也是枚举值,包括以下几个:
DEVICE_STATE_ACTIVE:当前激活的设备
DEVICE_STATE_DISABLED:当前禁用的设备
DEVICE_STATE_NOTPRESENT:不存在的终端设备,即已经中系统中删除的设备,或者在设备管理器中禁用的设备。
DEVICE_STATE_UNPLUGGED:未插电的设备。
第三个参数,指向设备集合对象的接口。
2.用GetCount函数获取设备总数量
3.用Item函数索引单个设备。
4.用获取到的设备指针,激活应用程序音量管理指针。
Activate函数
第一个参数:设备标示符。是对GUID的一个引用,标示请求激活的接口。调用者将使用这个接口与COM对象通信。
第二个参数:用于管理将要执行的对象,可以将多个枚举值相或来设置,也可以使用CLSCTX_ALL,可以通过指定CLSCTX_ALL避免上下文的限制。
第三个参数:当用来激活设备的IAudioClient、IAudioEndpointVolume IAudioMeterInformation IAudioSessionManager或IDeviceTopology这些接口时,设置为NULL。
第四个参数:指向指定接口参数地址的指针。
5.用GetSessionEnumerator获取IAudioSessionEnumerator指针。其中包含了所有应用程序音量的控制指针。同样可以用GetCount来获取到总数。
6.用GetSession获取IAudioSessionControl指针。以上文的Item函数相似。
7.用QueryInterface通过IAudioSessionControl指针查询到IAudioSessionControl2指针,根据第一个参数设置的IID的值去查询相应的指针。
8.获取到该应用程序的PID
9.用QueryInterface获取音量控制指针
10.如果当前应用程序的PID与IAudioSessionControl2指针获取到的PID相等,则设备当前应用程序的音量。自然,也可以指定PID来控制特定应用程序的音量。