win7音频service调节单个程序音量控制

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

代码如下:

  1. BOOL SetCurrentProcessVolume(DWORD dwVolume,BOOL IsMixer/*TRUE*/)  
  2. {  
  3.     HRESULT hr <span style="white-space:pre">                 </span>= S_OK;  
  4.     IMMDeviceCollection *pMultiDevice       = NULL;  
  5.     IMMDevice *pDevice              = NULL;  
  6.     IAudioSessionEnumerator *pSessionEnum       = NULL;  
  7.     IAudioSessionManager2 *pASManager       = NULL;  
  8.     IMMDeviceEnumerator *m_pEnumerator      = NULL;  
  9.     const IID IID_ISimpleAudioVolume        = __uuidof(ISimpleAudioVolume);  
  10.     const IID IID_IAudioSessionControl2     = __uuidof(IAudioSessionControl2);  
  11.   
  12.     CoInitialize(NULL);  
  13.     hr = CoCreateGuid(&m_guidMyContext);  
  14.     if(FAILED(hr))  
  15.         return FALSE;  
  16.     // Get enumerator for audio endpoint devices.  
  17.     hr = CoCreateInstance(__uuidof(MMDeviceEnumerator),  
  18.         NULL, CLSCTX_ALL,  
  19.         __uuidof(IMMDeviceEnumerator),  
  20.         (void**)&m_pEnumerator);  
  21.     if(FAILED(hr))  
  22.         return FALSE;  
  23.   
  24.     if (IsMixer)  
  25.     {  
  26.         hr = m_pEnumerator->EnumAudioEndpoints(eRender,DEVICE_STATE_ACTIVE, &pMultiDevice);  
  27.     }   
  28.     else  
  29.     {  
  30.         hr = m_pEnumerator->EnumAudioEndpoints(eCapture,DEVICE_STATE_ACTIVE, &pMultiDevice);  
  31.     }  
  32.     if(FAILED(hr))  
  33.         return FALSE;  
  34.   
  35.     UINT deviceCount = 0;  
  36.     hr = pMultiDevice->GetCount(&deviceCount);        
  37.     if(FAILED(hr))  
  38.         return FALSE;    
  39.       
  40.     if((int)dwVolume < 0)  
  41.         dwVolume = 0;  
  42.     if((int)dwVolume > 100)  
  43.         dwVolume = 100;  
  44.     for (UINT ii=0; ii<deviceCount; ii++)  
  45.     {  
  46.         pDevice = NULL;        
  47.         hr = pMultiDevice->Item(ii,&pDevice);      
  48.         if(FAILED(hr))  
  49.             return FALSE;   
  50.         hr = pDevice->Activate(__uuidof(IAudioSessionManager),CLSCTX_ALL, NULL,(void**)&pASManager);  
  51.   
  52.         if(FAILED(hr))  
  53.             return FALSE;   
  54.         hr = pASManager->GetSessionEnumerator(&pSessionEnum);  
  55.         if(FAILED(hr))  
  56.             return FALSE;   
  57.         int nCount;  
  58.         hr = pSessionEnum->GetCount(&nCount);  
  59.         for (int i = 0; i < nCount; i++)   
  60.         {  
  61.             IAudioSessionControl *pSessionCtrl;  
  62.             hr = pSessionEnum->GetSession(i, &pSessionCtrl);  
  63.             if (FAILED(hr))   
  64.                 continue;  
  65.             IAudioSessionControl2 *pSessionCtrl2;  
  66.             hr = pSessionCtrl->QueryInterface(IID_IAudioSessionControl2, (void **)&pSessionCtrl2);  
  67.             if(FAILED(hr))  
  68.                 continue;  
  69.             ULONG pid;  
  70.             hr = pSessionCtrl2->GetProcessId(&pid);  
  71.             if (FAILED(hr))  
  72.                 continue;  
  73.               
  74.             ISimpleAudioVolume *pSimplevol;  
  75.             hr = pSessionCtrl2->QueryInterface(IID_ISimpleAudioVolume, (void **)&pSimplevol);  
  76.             if (FAILED(hr))   
  77.                 continue;  
  78.             if (pid == GetCurrentProcessId())  
  79.             {                 
  80.                 pSimplevol->SetMasterVolume((float)dwVolume/100, NULL);  
  81.             }  
  82.             else  
  83.             {  
  84.                 pSimplevol->SetMasterVolume((float)0/100, NULL);  
  85.             }  
  86.               
  87.         }         
  88.     }  
  89.     SAFE_RELEASE(m_pEnumerator);  
  90.     return TRUE;  
  91. }  
说明:

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来控制特定应用程序的音量。

猜你喜欢

转载自blog.csdn.net/u014421422/article/details/79524834