【问题标题】:Controlling the volume of other applications控制其他应用程序的音量
【发布时间】:2009-11-24 16:49:40
【问题描述】:

我正在尝试制作一个使用 Windows 7 音频 API 控制另一个进程的音量的应用。

我正在寻找的是 ISimpleAudioVolume 用于其他进程使用的会话。

我曾尝试使用IAudioSessionEnumerator,但它只会给我会话的IAudioSessionControl2。使用 IAudioSessionControl,当我通过 sndvol 更改音量但我自己没有更改时,我设法接收到通知。

我也尝试过使用 IAudioSessionManager 中的GetSimpleAudioVolume(),但它只会在当前进程中为我提供会话。

你是怎么做到的?应该是可以的,因为 sndvol 是这样做的。

【问题讨论】:

  • 肯定有可能......太糟糕了that guy 没有解释他是如何做到的。

标签: com windows-7 audio core-audio


【解决方案1】:

以下是使用 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;
}

【讨论】:

    【解决方案2】:

    关于这个问题有一个MSDN forum questionBlog Post。希望这会有所帮助。

    【讨论】:

    • 我在链接中找不到任何关于我的问题的信息。博客是关于控制主音量,而论坛主题是关于改变输入设备的音量?我错过了什么吗?
    • 好吧,我猜 Windows 7 会将您留在沙盒中,不会让您修改其他应用程序的音量。替代方法(上面发布)是您修改主卷。它将修改所有应用程序的音量,但这是我能找到的最接近的。
    【解决方案3】:

    根据拉里·奥斯特曼的说法

    “没有公开记录的机制来做你想做的事。”

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-15
      • 2011-01-22
      • 1970-01-01
      • 2012-07-16
      • 2014-01-23
      • 2011-12-18
      • 2011-06-04
      相关资源
      最近更新 更多