Window编程获取系统音量大小等信息

本文详细介绍了如何使用C++和WindowsAPI中的MMDeviceEnumerator接口获取计算机的音频输出端点音量级别和静音状态。通过实例代码展示了如何遍历音频设备并操作音量控制。
摘要由CSDN通过智能技术生成

主要使用Window API获取系统音量大小。

#include <Windows.h>
#include <mmdeviceapi.h>
#include <endpointvolume.h>
#include <iostream>

bool getAudioStatus(int* volume, bool* muted)
{
    const CLSID CLSID_MMDeviceEnumerator = __uuidof(MMDeviceEnumerator);
    const IID IID_IMMDeviceEnumerator = __uuidof(IMMDeviceEnumerator);
    const IID IID_IAudioEndpointVolume = __uuidof(IAudioEndpointVolume);

    IMMDeviceEnumerator* pEnumerator = nullptr;
    IMMDeviceCollection* pCollection = nullptr;
    IMMDevice* pDevice = nullptr;
    IAudioEndpointVolume* pAudioEndpointVolume = nullptr;
    UINT DeviceCounts;
    DWORD pdwState;
    LPWSTR strid = nullptr;

    //初始化当前线程上的 COM 库,并将并发模型标识为单线程单元 (STA).必须调用此函数
    HRESULT hr = CoInitialize(NULL);

    if (FAILED(hr))
    {
        return false;
    }

    //创建并默认初始化与指定 CLSID 关联的类的单个对象。
    hr = CoCreateInstance(CLSID_MMDeviceEnumerator, NULL,CLSCTX_ALL,     IID_IMMDeviceEnumerator,(void**)&pEnumerator);
    if (FAILED(hr))
    {
        return false;
    }

    //生成满足指定条件的音频终结点设备的集合
    pEnumerator->EnumAudioEndpoints(eRender, DEVICE_STATE_ACTIVE, &pCollection);
    pCollection->GetCount(&DeviceCounts);

    for (int count = 0; count < DeviceCounts; count++)
    {
        pCollection->Item(count, &pDevice);
        pDevice->GetState(&pdwState);

        //音频终结点设备处于活动状态
        if (pdwState == DEVICE_STATE_ACTIVE)
        {
            pDevice->GetId(&strid);
            pDevice->Activate(IID_IAudioEndpointVolume, CLSCTX_ALL, NULL, (void**)&pAudioEndpointVolume);

            float level;
            BOOL Muted;
            pAudioEndpointVolume->GetMasterVolumeLevelScalar(&level);
            pAudioEndpointVolume->GetMute(&Muted);

            *volume = (int)(level * 100);
            *muted = (bool)Muted;

            pDevice->Release();
            pAudioEndpointVolume->Release();
            break;
        }
    }
    
    //释放资源
    pEnumerator->Release();
    pCollection->Release();
    
    //记得释放
    CoUninitialize();
}

int main()
{
    int volume;
    bool muted;
    getAudioStatus(&volume, &muted);

    std::cout << "volume:" << volume  << " muted:" << muted;
    return 0;
}
参考:

https://learn.microsoft.com/zh-cn/windows/win32/api/mmdeviceapi/nn-mmdeviceapi-immdeviceenumerator

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值