http://hi.baidu.com/%CE%E2%D6%BE%C7%BF/blog/item/b69d4ffbe1c56663034f56a5.html
//targetver.h
#ifndef _WIN32_WINNT // 指定要求的最低平台是 Windows Vista。
#define _WIN32_WINNT 0x0600 // 将此值更改为相应的值,以适用于 Windows 的其他版本。
//stdafx.h
#include "Audioclient.h"
#include "atlbase.h"
#include "Mmdeviceapi.h"
#include "Endpointvolume.h"
//音量控制方法
BOOL GetVolumn(UINT& uVol)
{
CoInitialize(NULL);
GetVolumnVista(uVol);
CoUninitialize();
}
BOOL GetVolumnVista(UINT& uVol)
{
IMMDeviceEnumerator* m_pEnumerator = NULL;
HRESULT hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_ALL, __uuidof(IMMDeviceEnumerator), (void**)&m_pEnumerator);
if (FAILED(hr)) return FALSE;
IMMDevice* m_pDeviceOut = NULL;
hr = m_pEnumerator->GetDefaultAudioEndpoint(eRender, eMultimedia, &m_pDeviceOut);
if (FAILED(hr)) return FALSE;
IAudioEndpointVolume* m_AudioEndpointVolume = NULL;
hr = m_pDeviceOut->Activate(__uuidof(IAudioEndpointVolume), CLSCTX_ALL, NULL, (void**)&m_AudioEndpointVolume);
if (FAILED(hr)) return FALSE;
IAudioClient* pAudioClient = NULL;
hr = m_pDeviceOut->Activate(__uuidof(IAudioClient), CLSCTX_ALL, NULL, (void**)&pAudioClient);
if (FAILED(hr)) return FALSE;
UINT uStep = 0;
UINT uStepCount = 0;
hr = m_AudioEndpointVolume->GetVolumeStepInfo(&uStep, &uStepCount);
if (FAILED(hr)) return FALSE;
uVol = (uStep * 100) / uStepCount;
return TRUE;
}
void SetVolumn(UINT nInputSetp)
{
CoInitialize(NULL);
SetVolumnVista(nInputSetp);
CoUninitialize();
}
void SetVolumnVista(UINT nInputStep)
{
IMMDeviceEnumerator* m_pEnumerator = NULL;
HRESULT hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_ALL, __uuidof(IMMDeviceEnumerator), (void**)&m_pEnumerator);
if (FAILED(hr)) return;
IMMDevice* m_pDeviceOut = NULL;
hr = m_pEnumerator->GetDefaultAudioEndpoint(eRender, eMultimedia, &m_pDeviceOut);
if (FAILED(hr)) return;
IAudioEndpointVolume* m_AudioEndpointVolume = NULL;
hr = m_pDeviceOut->Activate(__uuidof(IAudioEndpointVolume), CLSCTX_ALL, NULL, (void**)&m_AudioEndpointVolume);
if (FAILED(hr)) return;
IAudioClient* pAudioClient = NULL;
hr = m_pDeviceOut->Activate(__uuidof(IAudioClient), CLSCTX_ALL, NULL, (void**)&pAudioClient);
if (FAILED(hr)) return;
UINT uStep = 0;
UINT uStepCount = 0;
hr = m_AudioEndpointVolume->GetVolumeStepInfo(&uStep, &uStepCount);
if (FAILED(hr)) return;
UINT uVol = (nInputStep * uStepCount) / 100;
BOOL bUp = uVol < uStep;
UINT uLess = bUp ? (uStep - uVol) : (uVol - uStep);
for (UINT i = 0; i < uLess; i++)
{
if (!bUp)
{
hr = m_AudioEndpointVolume->VolumeStepUp(&GUID_NULL);
}
else
{
hr = m_AudioEndpointVolume->VolumeStepDown(&GUID_NULL);
}
if (FAILED(hr)) return;
}
}