bool CMutedSessionEvents::TxSetMuted(bool bMuted) { HRESULT hr = S_FALSE; // 获得音量、静音控制接口 ISimpleAudioVolume *pAudioVolume = NULL; hr = m_AudioSessionManager->GetSimpleAudioVolume(NULL,0,&pAudioVolume); if (FAILED(hr)) return false; if(SUCCEEDED(hr)) { pAudioVolume->SetMute(bMuted, &GUID_NULL); // 更改全局静音状态 g_bMuted = bMuted; } if (pAudioVolume != NULL) { pAudioVolume->Release(); pAudioVolume = NULL; } return true; }
HRESULT CVistaVolume::SetMute(BOOL bMute) { if (m_bMute == bMute) return S_OK; HRESULT hr = E_FAIL; IMMDevice* pDevice; hr = m_pEnumerator->GetDefaultAudioEndpoint(eRender, eConsole, &pDevice); if (FAILED(hr)) return hr; IAudioSessionManager2* pasm = NULL; hr = pDevice->Activate(__uuidof(IAudioSessionManager2), CLSCTX_ALL, NULL, (void**)&pasm); if (FAILED(hr)) return hr; IAudioSessionEnumerator* audio_session_enumerator; if(SUCCEEDED(pasm->GetSessionEnumerator(&audio_session_enumerator))) { int count; if(SUCCEEDED(audio_session_enumerator->GetCount(&count))) { for (int i = 0; i < count; i++) { IAudioSessionControl* audio_session_control; IAudioSessionControl2* audio_session_control2; if(SUCCEEDED(audio_session_enumerator->GetSession(i, &audio_session_control))) { if(SUCCEEDED(audio_session_control->QueryInterface(__uuidof(IAudioSessionControl2), (void**)&audio_session_control2))) { DWORD processid; if(SUCCEEDED(audio_session_control2->GetProcessId(&processid))) { if (processid == GetCurrentProcessId()) { ISimpleAudioVolume* pSAV; hr = audio_session_control2->QueryInterface(__uuidof(ISimpleAudioVolume), (void**) &pSAV); if (SUCCEEDED(hr)) { hr = pSAV->SetMute(bMute, NULL); if (SUCCEEDED(hr)) { m_bMute = bMute; } pSAV->Release(); } } audio_session_control->Release(); audio_session_control2->Release(); } } } } audio_session_enumerator->Release(); } } pasm->Release(); return hr; }
void changeFGWindowVolume() { if (soundOption == dncItemID) return; char titleBuff[128]; HWND activeHWND = GetForegroundWindow(); GetWindowText(activeHWND, titleBuff, 128); UINT count = sizeof(mediaCommands) / sizeof(mediaCommands[0]); for (UINT i = 0; i < count; i++) { if (strstr(titleBuff, mediaCommands[i].title) > 0) return; } IMMDevice *mmDevice; IMMDeviceEnumerator *mmDeviceEnum; IAudioSessionManager2 *sessionManager; IAudioSessionEnumerator *sessionEnum; IAudioSessionControl *sessionControl; IAudioSessionControl2 *sessionControl2; ISimpleAudioVolume *audioVolume; CoCreateInstance(__uuidof(MMDeviceEnumerator), 0, CLSCTX_ALL, __uuidof(IMMDeviceEnumerator), (void**)&mmDeviceEnum); mmDeviceEnum->GetDefaultAudioEndpoint(eRender, eMultimedia, &mmDevice); mmDevice->Activate(__uuidof(IAudioSessionManager2), CLSCTX_ALL, 0, (void**)&sessionManager); sessionManager->GetSessionEnumerator(&sessionEnum); DWORD activePid; GetWindowThreadProcessId(activeHWND, &activePid); int sessionCount; sessionEnum->GetCount(&sessionCount); for (int i = 0; i < sessionCount; i++) { sessionEnum->GetSession(i, &sessionControl); sessionControl->QueryInterface(__uuidof(IAudioSessionControl2), (void**)&sessionControl2); DWORD pid; sessionControl2->GetProcessId(&pid); if (activePid == pid) { sessionControl->QueryInterface(__uuidof(ISimpleAudioVolume), (void**)&audioVolume); BOOL muted; audioVolume->GetMute(&muted); float volumeLevel; audioVolume->GetMasterVolume(&volumeLevel); if (soundOption == muteItemID) { audioVolume->SetMute(!muted, 0); if (volumeLevel != 1.0f) { audioVolume->SetMasterVolume(1.0f, 0); } } else { float newVolumeLevel = (soundOption - sBaseItemID) / 100.0f; audioVolume->SetMasterVolume(volumeLevel == 1.0f ? newVolumeLevel : 1.0f, 0); if (muted) { audioVolume->SetMute(false, 0); } } audioVolume->Release(); } sessionControl->Release(); sessionControl2->Release(); } sessionEnum->Release(); sessionManager->Release(); mmDevice->Release(); mmDeviceEnum->Release(); }