如何使用混音器API在Windows 7中控制主控制台音量?

4
在Windows XP中,通过使用混音器API设置目标线路的音量可以很容易地控制混音设备的主音量。这可以通过Microsoft提供的SDK示例应用程序轻松测试。但在Windows 7中,每当我在我的应用程序中打开一个混音设备时,它都显示为新的音量应用程序,我只能控制我的应用程序的音量,无法控制整个系统的声音。有人能建议我如何控制扬声器的完整音量,以影响所有正在运行的应用程序的声音吗?
如何在Windows 7中使用我的应用程序更改扬声器音量?
1个回答

4
我认为您正在寻找的方法是SetMasterVolumeLevelScalar
以下是C语言中的简短示例(对于lpVtbl,我很抱歉):
BOOL AddMasterVolumeLevelScalar(float fMasterVolumeAdd)
{
    IMMDeviceEnumerator *deviceEnumerator = NULL;
    IMMDevice *defaultDevice = NULL;
    IAudioEndpointVolume *endpointVolume = NULL;
    HRESULT hr;
    float fMasterVolume;
    BOOL bSuccess = FALSE;

    hr = CoCreateInstance(&XIID_MMDeviceEnumerator, NULL, CLSCTX_INPROC_SERVER, &XIID_IMMDeviceEnumerator, (LPVOID *)&deviceEnumerator);
    if(SUCCEEDED(hr))
    {
        hr = deviceEnumerator->lpVtbl->GetDefaultAudioEndpoint(deviceEnumerator, eRender, eConsole, &defaultDevice);
        if(SUCCEEDED(hr))
        {
            hr = defaultDevice->lpVtbl->Activate(defaultDevice, &XIID_IAudioEndpointVolume, CLSCTX_INPROC_SERVER, NULL, (LPVOID *)&endpointVolume);
            if(SUCCEEDED(hr))
            {
                if(SUCCEEDED(endpointVolume->lpVtbl->GetMasterVolumeLevelScalar(endpointVolume, &fMasterVolume)))
                {
                    fMasterVolume += fMasterVolumeAdd;

                    if(fMasterVolume < 0.0)
                        fMasterVolume = 0.0;
                    else if(fMasterVolume > 1.0)
                        fMasterVolume = 1.0;

                    if(SUCCEEDED(endpointVolume->lpVtbl->SetMasterVolumeLevelScalar(endpointVolume, fMasterVolume, NULL)))
                        bSuccess = TRUE;
                }

                endpointVolume->lpVtbl->Release(endpointVolume);
            }

            defaultDevice->lpVtbl->Release(defaultDevice);
        }

        deviceEnumerator->lpVtbl->Release(deviceEnumerator);
    }

    return bSuccess;
}

如果GUID没有被定义:
const static GUID XIID_IMMDeviceEnumerator = { 0xA95664D2, 0x9614, 0x4F35, { 0xA7, 0x46, 0xDE, 0x8D, 0xB6, 0x36, 0x17, 0xE6 } };
const static GUID XIID_MMDeviceEnumerator = { 0xBCDE0395, 0xE52F, 0x467C, { 0x8E, 0x3D, 0xC4, 0x57, 0x92, 0x91, 0x69, 0x2E } };
const static GUID XIID_IAudioEndpointVolume = { 0x5CDF2C82, 0x841E, 0x4546, { 0x97, 0x22, 0x0C, 0xF7, 0x40, 0x78, 0x22, 0x9A } };

你的例子不起作用。缺少XIID_IAudioEndpointVolume和XIID_MMDeviceEnumerator的定义。 - this
这些值对我没用。我的解决方案是使用__uuidof( MMDeviceEnumerator )。感谢你的努力,但我不知道你从哪里找到这些值。(小抱怨:__uuidof就像黑魔法一样) - this
我不太记得了,但 Google 显示了这个链接(https://code.google.com/p/winuae-mod/source/browse/trunk/winuae+2.01/od-win32/sound.c?r=155),因此可能是源代码。这些数值对我来说有效,至少在 Windows 7 到 8.1 上是这样。 - Paul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接