以下代码针对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