【转】Vista下系统音量控制(VC版)

本文介绍了一个用于获取和设置Windows系统音量的C++ API实现。通过COM接口与MMDevice API交互,可以轻松地读取当前音量级别或调整音量大小。

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;
     }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值