Windows 7单个程序音量控制

以下代码的作用是控制当前程序的声音,并将其他程序的声音关闭。

代码如下:

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

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值