2009-11-24 7 views
3

Я пытаюсь создать приложение, которое контролирует громкость другого процесса с помощью Windows 7 Audio API.Управление громкостью других приложений

Что я ищу, это ISimpleAudioVolume для сеанса, используемого другим процессом.

Я попытался использовать IAudioSessionEnumerator, но он даст мне только IAudioSessionControl2 сеанса. Используя IAudioSessionControl, мне удалось получить уведомления, когда я изменяю том через sndvol, но не меняю его сам.

Я также попытался использовать GetSimpleAudioVolume() от IAudioSessionManager, но он даст мне только сеансы в текущем процессе.

Как вы это делаете? Это должно быть возможно, так как sndvol делает это.

+0

Можно точно .. тоже плохо [что парень] (http://blog.nirsoft.net/2011/02/25/how-to-control-the-volume-level-of- specific-application-from-command-line-on-windows-72008vista /) не объяснил, как он это сделал. – ThiefMaster

ответ

0

В этом вопросе есть MSDN forum question и Blog Post. Надеюсь это поможет.

+0

Я не могу найти ничего о своей проблеме в ссылках. Блог посвящен управлению основным томом, а поток форума - об изменении объемов устройств ввода? Я что-то упускаю? –

+0

Ну, я собираюсь предположить, что Windows 7 держит вас в песочнице и не позволит вам изменять объем других приложений. Альтернатива (выше) заключается в том, что вы изменяете главный том. Он будет изменять громкость для ВСЕХ приложений, но это самое близкое, что я мог найти. – 2009-11-25 02:36:30

0

Согласно Ларри Остерман

«Там нет публично задокументированы механизм делать то, что вы пытаетесь сделать.»

+0

См. Мой ответ .. – zenden2k

0

Ниже приведен пример заглушения другого процесса с использованием Core Audio API.

#include <windows.h> 
#include <iostream> 
#include <mmdeviceapi.h> 
#include <endpointvolume.h> 
#include <Audiopolicy.h> 
#include <comdef.h> 
#include <comip.h> 

#define CHECK_HR(hr) \ 
    if(FAILED(hr)) { \ 
     std::cout << "error" << std::endl; \ 
     return 0; \ 
       } 
_COM_SMARTPTR_TYPEDEF(IMMDevice, __uuidof(IMMDevice)); 
_COM_SMARTPTR_TYPEDEF(IMMDeviceEnumerator, __uuidof(IMMDeviceEnumerator)); 
_COM_SMARTPTR_TYPEDEF(IAudioSessionManager2, __uuidof(IAudioSessionManager2)); 
_COM_SMARTPTR_TYPEDEF(IAudioSessionManager2, __uuidof(IAudioSessionManager2)); 
_COM_SMARTPTR_TYPEDEF(IAudioSessionEnumerator, __uuidof(IAudioSessionEnumerator)); 
_COM_SMARTPTR_TYPEDEF(IAudioSessionControl2, __uuidof(IAudioSessionControl2)); 
_COM_SMARTPTR_TYPEDEF(IAudioSessionControl, __uuidof(IAudioSessionControl)); 
_COM_SMARTPTR_TYPEDEF(ISimpleAudioVolume, __uuidof(ISimpleAudioVolume)); 

IAudioSessionManager2Ptr CreateSessionManager() 
{ 
    HRESULT hr = S_OK; 

    IMMDevicePtr pDevice; 
    IMMDeviceEnumeratorPtr pEnumerator; 
    IAudioSessionManager2Ptr pSessionManager; 


    // Create the device enumerator. 
    CHECK_HR(hr = CoCreateInstance(
     __uuidof(MMDeviceEnumerator), 
     NULL, CLSCTX_ALL, 
     __uuidof(IMMDeviceEnumerator), 
     (void**)&pEnumerator)); 

    // Get the default audio device. 
    CHECK_HR(hr = pEnumerator->GetDefaultAudioEndpoint(
     eRender, eConsole, &pDevice)); 

    // Get the session manager. 
    CHECK_HR(hr = pDevice->Activate(
     __uuidof(IAudioSessionManager2), CLSCTX_ALL, 
     NULL, (void**)&pSessionManager)); 

    return pSessionManager; 
} 

bool MuteProcess(DWORD processId) { 

    IAudioSessionManager2Ptr mgr = CreateSessionManager(); 
    if (!mgr) { 
     return false; 
    } 
    IAudioSessionEnumeratorPtr enumerator; 
    if (SUCCEEDED(mgr->GetSessionEnumerator(&enumerator))) { 
     int sessionCount; 
     if (SUCCEEDED(enumerator->GetCount(&sessionCount))) { 
      for (int i = 0; i < sessionCount; i++) { 
       IAudioSessionControlPtr control; 
       if (SUCCEEDED(enumerator->GetSession(i, &control))) { 
        IAudioSessionControl2Ptr control2; 
        if (SUCCEEDED(control->QueryInterface(__uuidof(IAudioSessionControl2), (void**)&control2))) { 
         DWORD foundProcessId; 
         if (SUCCEEDED(control2->GetProcessId(&foundProcessId))) { 
          if (foundProcessId == processId) { 
           ISimpleAudioVolumePtr volume; 
           if (SUCCEEDED(control2->QueryInterface(_uuidof(ISimpleAudioVolume), (void**)&volume))) { 
            if (SUCCEEDED(volume->SetMute(TRUE, 0))) { 
             return true; 
            } 
           } 
          } 
         } 

        } 

       } 
      } 
     } 
    } 
    return false; 
} 

int _tmain(int argc, _TCHAR* argv[]){ 
    CoInitialize(NULL); 
    DWORD processId = 11944; 
    MuteProcess(processId); 

    return 0; 
} 
Смежные вопросы