注意:前面的全局函数如果报错加内联 inline,我在ue c++中测试过
测试:创建SetWinSound 对象,调用函数即可
代码如下:
.h
#include <iostream>
#include <windows.h>
#include <mmdeviceapi.h>
#include <endpointvolume.h>
// 获取默认音频设备
IMMDevice* GetDefaultAudioDevice()
{
IMMDeviceEnumerator* deviceEnumerator = NULL;
HRESULT hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_INPROC_SERVER,
__uuidof(IMMDeviceEnumerator), (LPVOID*)&deviceEnumerator);
if (FAILED(hr))
{
return NULL;
}
IMMDevice* defaultDevice = NULL;
hr = deviceEnumerator->GetDefaultAudioEndpoint(eRender, eConsole, &defaultDevice);
deviceEnumerator->Release();
if (FAILED(hr))
{
return NULL;
}
return defaultDevice;
}
// 获取音量控制接口
IAudioEndpointVolume* GetAudioEndpointVolume(IMMDevice* device)
{
IAudioEndpointVolume* endpointVolume = NULL;
HRESULT hr = device->Activate(__uuidof(IAudioEndpointVolume), CLSCTX_INPROC_SERVER,
NULL, (LPVOID*)&endpointVolume);
if (FAILED(hr))
{
return NULL;
}
return endpointVolume;
}
// 获取当前音量(0-100)
int GetCurrentVolume(IAudioEndpointVolume* endpointVolume)
{
float currentVolume = 0.0f; // 0.0 - 1.0
HRESULT hr = endpointVolume->GetMasterVolumeLevelScalar(¤tVolume);
if (FAILED(hr))
{
return -1;
}
return int(currentVolume * 100); // convert to percentage
}
// 设置音量(0-100)
void SetCurrentVolume(IAudioEndpointVolume* endpointVolume, int volume)
{
float newVolume = volume / 100.0f; // convert to scalar
HRESULT hr = endpointVolume->SetMasterVolumeLevelScalar(newVolume, NULL);
}
class SetWinSound
{
public:
SetWinSound();
public:
IMMDevice* device;
IAudioEndpointVolume* endpointVolume;
//设置音量大小
int new_volume = 50;
//设置系统声音
int SetWindowsSound(int new_volume);
//设置当前声音
int GetWindowsSound();
};
.cpp
#include "SetWinSound.h"
SetWinSound::SetWinSound()
{
CoInitializeEx(NULL, COINIT_MULTITHREADED); // initialize COM library
device = GetDefaultAudioDevice(); // get default audio device
endpointVolume = GetAudioEndpointVolume(device); // get audio endpoint volume interface
}
int SetWinSound::SetWindowsSound(int new_volume1)
{
SetCurrentVolume(endpointVolume, new_volume1);
endpointVolume->Release(); // release resources
device->Release();
CoUninitialize();
return 0;
}
int SetWinSound::GetWindowsSound()
{
GetCurrentVolume(endpointVolume);
endpointVolume->Release(); // release resources
device->Release();
CoUninitialize();
return 0;
}