windows api 控制系统音量

以下代码针对window10支持,其他版本有待测试。当然如果通过系统键盘钩子获取VK_VOLUME_DOWN和VK_VOLUME_UP标识也是可以的,直接抛给windows系统自己去处理。另外需要注意笔记本键盘和外设Hid键盘处理也是不一样的。

SystemVolumn.h

#pragma once

#ifndef _SystemVolume_h_

#include <windows.h>
#include <mmdeviceapi.h>
#include <endpointvolume.h>
#include <audioclient.h>

#ifndef SYSTEM_DLLEXPORT // SYSTEM_DLLEXPORT
#define SYSTEM_DLLEXPORTAPI __declspec(dllexport)
#else
#define SYSTEM_DLLEXPORTAPI __declspec(dllimport)
#endif //! SYSTEM_DLLEXPORT

#define _SystemVolume_h_

namespace SystemConf
{

class SystemVolume
{
public:
    explicit SystemVolume();
    virtual ~SystemVolume();

private:
    HRESULT hr;
    IMMDeviceEnumerator *pDeviceEnumerator = 0;
    IMMDevice *pDevice = 0;
    IAudioEndpointVolume *pAudioEndpointVolume = 0;
    IAudioClient *pAudioClient = 0;

public:
    /**初始化服务*/
    void Init();
    /**关闭服务 释放资源*/
    void Close();
    /**设置音量*/
    void SetVolume(int volume);
    /**获取系统音量*/
    int GetVolume();
    /**静音*/
    void Mute();
    /**解除静音*/
    void UnMute();
};

SYSTEM_DLLEXPORTAPI void SetVolumn(int volumn);
SYSTEM_DLLEXPORTAPI int GetVolumn();

} // namespace SystemConf
#endif

SystemVolumn.cpp

#include "SystemVolume.h"

#include <math.h>
#include <memory>
#include <string>
#include "KLog.h"

#pragma comment(lib, "Ole32.lib") // also ok

namespace SystemConf
{
SystemVolume::SystemVolume()
{
    try
    {
        Init();

        GetVolume();
    }
    catch (std::string e)
    {
        KERRORLOG("SystemVolume Init error:" << e);
    }
    catch (...)
    {
    }
}
SystemVolume::~SystemVolume()
{
    Close();
}

void SystemVolume::Init()
{
    hr = CoInitialize(0);
    hr = CoCreateInstance(
        __uuidof(MMDeviceEnumerator), NULL, CLSCTX_ALL, __uuidof(IMMDeviceEnumerator), (void **)&pDeviceEnumerator);
    if (FAILED(hr))
        throw "InitException:pDeviceEnumerator is NULL;";
    hr = pDeviceEnumerator->GetDefaultAudioEndpoint(eRender, eMultimedia, &pDevice);
    if (FAILED(hr))
        throw "InitException:pDevice is NULL";
    hr = pDevice->Activate(__uuidof(IAudioEndpointVolume), CLSCTX_ALL, NULL, (void **)&pAudioEndpointVolume);
    if (FAILED(hr))
        throw "pDevice->Active";
    hr = pDevice->Activate(__uuidof(IAudioClient), CLSCTX_ALL, NULL, (void **)&pAudioClient);
    if (FAILED(hr))
        throw "pDevice->Active";
}

void SystemVolume::Close()
{
    if (pAudioClient)
        pAudioClient->Release();
    if (pAudioEndpointVolume)
        pAudioEndpointVolume->Release();
    if (pDevice)
        pDevice->Release();
    if (pDeviceEnumerator)
        pDeviceEnumerator->Release();
    CoUninitialize();
}

void SystemVolume::SetVolume(int volume)
{
    if ((volume - 100.0f) > 0)
        volume = 100.0f;
    else if (volume < 0)
        volume = 0.0;

    float fVolume = volume / 100.0f;
    hr = pAudioEndpointVolume->SetMasterVolumeLevelScalar(fVolume, &GUID_NULL);
    if (FAILED(hr))
        throw "SetMasterVolumeLevelScalar";
}

int SystemVolume::GetVolume()
{
    float volume;
    hr = pAudioEndpointVolume->GetMasterVolumeLevelScalar(&volume);
    if (FAILED(hr))
        throw "getVolume() throw Exception";
    return (int)round(volume * 100.0);
}

void SystemVolume::Mute()
{
    hr = pAudioEndpointVolume->SetMute(TRUE, NULL);
    if (FAILED(hr))
        throw "Mute() throw Exception";
}

void SystemVolume::UnMute()
{
    hr = pAudioEndpointVolume->SetMute(FALSE, NULL);
    if (FAILED(hr))
        throw "UnMute() throw Exception";
}

void SetVolumn(int volumn)
{
    auto var = std::make_shared<SystemVolume>();
    var.get()->SetVolume(volumn);
}

int GetVolumn()
{
    auto var = std::make_shared<SystemVolume>();

    return var.get()->GetVolume();
}

} // namespace SystemConf

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值