2009-11-24 86 views
3

我正在嘗試製作一個應用程序,該應用程序使用Windows 7音頻API控制另一個進程的音量。控制其他應用程序的音量

我在找的是ISimpleAudioVolume其他進程使用的會話。

我試過使用IAudioSessionEnumerator但它只會給我會話的IAudioSessionControl2。使用IAudioSessionControl我設法接收通知,當我通過sndvol更改音量但不能自己更改音量時。

我也試過從IAudioSessionManager使用GetSimpleAudioVolume(),但它只會給我當前進程內的會話。

你怎麼做到的?這應該是可能的,因爲sndvol正在這樣做。

+0

這是可能的肯定..太糟糕[那傢伙](http://blog.nirsoft.net/2011/02/25/how-to-control-the-volume-level-of-特定的應用程序從命令行在windows-72008vista /)沒有解釋他是如何做到的。 – ThiefMaster 2013-12-06 17:10:07

回答

0

關於這個問題,有一個MSDN forum questionBlog Post。希望這可以幫助。

+0

我找不到任何有關我的問題的鏈接。博客是關於控制主音量和論壇主題是關於改變輸入設備的音量?我錯過了什麼嗎? – 2009-11-24 19:41:06

+0

那麼,我猜測Windows 7會讓你保持在沙箱中,並且不會讓你修改其他應用的音量。另一種方法(如上所述)是您修改主卷。它會修改所有應用程序的音量,但這是我能找到的最接近的音量。 – 2009-11-25 02:36:30

0

根據拉里·奧斯特曼

「目前還沒有公開發布機制,做你想要做的事。」

+0

看到我的答案.. – zenden2k 2015-09-06 16:37:20

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; 
}