以下代码的作用是控制当前程序的声音,并将其他程序的声音关闭。
代码如下:
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 方法用于生成符合指定标准的终端设备的一个合集。
第一个参数为枚举值,包括以下三个:
eRen