您的位置:首页 > 其它

MFC根据进程名独立的进行音量控制——仅限于windows vista之后的版本

2014-10-28 09:52 417 查看
{

HRESULT hr = S_OK;

IMMDevice* pDevice = NULL;

IMMDeviceEnumerator* pEnumerator = NULL;

IAudioSessionControl* pSessionControl = NULL;

IAudioSessionControl2* pSessionControl2 = NULL;

IAudioSessionManager* pSessionManager = NULL;

IAudioSessionManager2* pSessionManager2 = NULL;

IAudioSessionEnumerator* pSessionEnumerator = NULL;

AudioSessionState mAudiosessionState;

ISimpleAudioVolume* pSimpleAudioVolume = NULL;

int counts = 0;

WCHAR name2[512];

DWORD puid;

GUID pGuid;

float fVol;

wchar_t ProcessNamef[MAX_PATH] = L"unknown";

hr = CoInitialize(NULL);

// Create the device enumerator.

hr = CoCreateInstance(

__uuidof(MMDeviceEnumerator),

NULL, CLSCTX_ALL,

__uuidof(IMMDeviceEnumerator),

(void**)&pEnumerator);

// Get the default audio device.

hr = pEnumerator->GetDefaultAudioEndpoint(

eRender, eConsole, &pDevice);

// Get the audio client.

hr = pDevice->Activate(

__uuidof(IAudioSessionManager), CLSCTX_ALL,

NULL, (void**)&pSessionManager);

hr = pDevice->Activate(

__uuidof(IAudioSessionManager2), CLSCTX_ALL,

NULL, (void**)&pSessionManager2);

hr = pSessionManager2->GetSessionEnumerator(&pSessionEnumerator);

pSessionEnumerator->GetCount(&counts);

for (int i = 0; i < counts; i++)

{

pSessionEnumerator->GetSession(i, &pSessionControl);

hr = pSessionControl->QueryInterface(

__uuidof(IAudioSessionControl2), (void**)&pSessionControl2);

// Check whether this is a system sound.

hr = pSessionControl2->IsSystemSoundsSession();

if (hr)

{

hr = pSessionControl2->SetDuckingPreference(TRUE);

pSessionControl2->GetState(&mAudiosessionState);

if (mAudiosessionState == AudioSessionStateActive)

{

pSessionControl2->GetProcessId(&puid);

hr = pSessionControl->QueryInterface(

__uuidof(ISimpleAudioVolume), (void**)&pSimpleAudioVolume);

//pSimpleAudioVolume->GetMasterVolume(&fVol);

fVol = C_G_Balance / 100;

//index_Lync_updata();

// pSimpleAudioVolume->SetMasterVolume(0.1, &pGuid);

// PidToProcessName(puid, ProcessNamef);

bool findCPN = 0;

for (int j = 0; j < ChatProcessName_count; j++)

{

if (puid == AudioPID_Name_List[index_Lync[j]].puid)

{

pSimpleAudioVolume->SetMasterVolume(fVol, &pGuid);

findCPN = 1;

break;

}

}

if (findCPN == 0)

{

pSimpleAudioVolume->SetMasterVolume((1 - fVol), &pGuid);

}

//printf("puid=%d vol=%f\r\n", puid,fVol);

}

}

}

if (num_for_out)

pSimpleAudioVolume->Release();

pSessionEnumerator->Release();

pSessionControl2->Release();

pSessionControl->Release();

pSessionManager2->Release();

pSessionManager->Release();

pEnumerator->Release();

pDevice->Release();

return hr;

}

直接上代码,注意pSimpleAudioVolume的获取是关节点
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: