注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

BCB-DG's Blog

...

 
 
 

日志

 
 

XP/WIN7音量設置  

2013-02-26 11:02:44|  分类: Delphi |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

//转
#pragma once
#include <stdio.h>
#include <tchar.h>
#include <Windows.h>
#include <MMSystem.h>
#include <stdlib.h>
#include <commctrl.h>
#include <mmdeviceapi.h>
#include <endpointvolume.h>

#define SAFE_RELEASE(punk)  \
 if ((punk) != NULL)  \
{ (punk)->Release(); (punk) = NULL; }

typedef enum WindowsType
{
 UnknownOS = 0,
 WindowsXP = 1,
 WindowsVista = 2,
 Windows7 = 3,
};

#define MAX_VOL 100

class CMyVolumeCtrl
{
public:
 CMyVolumeCtrl(void);
 ~CMyVolumeCtrl(void);
 int GetMaxVol();
 int GetMinVol();
 int GetVolume();
 BOOL SetVolume(int nVol);
 BOOL SetMute(BOOL bMute);
 BOOL GetMute();

protected: //for xp
 unsigned int vGetVolume(int   dev);
 BOOL vSetVolume(long   dev,long   vol);
 BOOL vSetMute(long   dev,long   vol);
 BOOL vGetMute(long   dev);
 BOOL   vGetVolumeControl(HMIXER   hmixer   ,long   componentType,long   ctrlType,MIXERCONTROL*   mxc) ;
 long   vGetMuteValue(HMIXER   hmixer   ,MIXERCONTROL   *mxc) ;
 unsigned int vGetVolumeValue(HMIXER   hmixer   ,MIXERCONTROL   *mxc) ;
 BOOL   vSetMuteValue(HMIXER   hmixer   ,MIXERCONTROL   *mxc,   BOOL   mute) ;
 BOOL   vSetVolumeValue(HMIXER   hmixer   ,MIXERCONTROL   *mxc,   long   volume) ;
 
protected://for vista and win7
 BOOL vInitEndPoint();
 BOOL vMuteSet(BOOL bMute);
 BOOL vMuteGet();
 BOOL vVolumeSet(DWORD dwVolume);
 BOOL vVolumeGet(DWORD* pdwVolume);
 BOOL vUninitEndPoint();
 
protected:
 WindowsType vGetWindowsType();
 WindowsType m_eWinType;
 IAudioEndpointVolume *m_pEndptVolCtrl;
 IMMDeviceEnumerator *m_pEnumerator;
 IMMDevice *m_pDevice;
 GUID m_guidMyContext;
};


#include "StdAfx.h"
#include "MyVolumeCtrl.h"
#pragma comment(lib, "Winmm.lib")

CMyVolumeCtrl::CMyVolumeCtrl(void)
:m_pEndptVolCtrl(NULL),
m_pEnumerator(NULL),
m_pDevice(NULL),
m_guidMyContext(GUID_NULL)
{
 m_eWinType = vGetWindowsType();
 TRACE("Now windows is %d", m_eWinType);
 if(WindowsVista == m_eWinType|| Windows7 == m_eWinType)
  vInitEndPoint();
}

CMyVolumeCtrl::~CMyVolumeCtrl(void)
{
 if(WindowsVista == m_eWinType|| Windows7 == m_eWinType)
  vUninitEndPoint();
 m_eWinType = UnknownOS;
}

int CMyVolumeCtrl::GetMaxVol()
{
 return MAX_VOL;
}

int CMyVolumeCtrl::GetMinVol()
{
 return 0;
}

int CMyVolumeCtrl::GetVolume()
{
 int nVol = 0;
 DWORD dwNowMaxVol = GetMaxVol();
 switch (m_eWinType)
 {
 case WindowsXP:
  {   
   unsigned int nXPVol = vGetVolume(0);
   TRACE("XP vol = %d, nowmax = %d", nXPVol, dwNowMaxVol);
   nVol = nXPVol;
  }
  break;
 case WindowsVista:
 case Windows7:
  {
   DWORD dwNewVol = 0;
   vVolumeGet(&dwNewVol);
   nVol = dwNewVol;
  }  
  break;
 default:
  nVol = -1;
 }
 return nVol;
}

BOOL CMyVolumeCtrl::SetVolume(int nVol)
{
 BOOL bSet = FALSE;
 DWORD dwNowMaxVol = GetMaxVol();
 switch (m_eWinType)
 {
 case WindowsXP:
  {
   long nXPSetVol = nVol;
   bSet = vSetVolume(0, nXPSetVol);
  }
  break;
 case WindowsVista:
 case Windows7:
  {
   int nWin7SetVol = nVol ;
   bSet = vVolumeSet(nWin7SetVol);
  }
  break;
 default:
  bSet = FALSE;
}
 return bSet;
}

BOOL CMyVolumeCtrl::SetMute(BOOL bMute)
{
 BOOL bSet = FALSE;
 switch (m_eWinType)
 {
 case WindowsXP:
  bSet = vSetMute(0, bMute);
  break;
 case WindowsVista:
 case Windows7:
  bSet = vMuteSet(bMute);
  break;
 default:
  bSet = FALSE;
}
 return bSet;
}

BOOL CMyVolumeCtrl::GetMute()
{
 BOOL bMute = FALSE;
 switch (m_eWinType)
 {
 case WindowsXP:
  bMute = vGetMute(0);
  break;
 case WindowsVista:
 case Windows7:
  bMute  = vMuteGet();
  break;
 default:
  bMute = FALSE;
 }
 return bMute;
}

unsigned int CMyVolumeCtrl::vGetVolume(int   dev)//得到设备的音量dev=0主音量,1WAVE   ,2MIDI   ,3   LINE   IN
{
 long   device;
 unsigned   int rt=0;
 MIXERCONTROL   volCtrl;
 HMIXER   hmixer;
 switch   (dev)
 {
 case   1:
  device=MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT;   break;
 case   2:
  device=MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZER;   break;
 case   3:
  //     device=MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC;   break;    //   cd   音量
  //     device=MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE;   break;     //麦克风音量
  //     device=MIXERLINE_COMPONENTTYPE_SRC_LINE;   break;           //PC   扬声器音量
  device=MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC;   break;
 default:
  device=MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
 }

 if(mixerOpen(&hmixer,   0,   0,   0,   0))   return   0;
 if(!vGetVolumeControl(hmixer,device,MIXERCONTROL_CONTROLTYPE_VOLUME,&volCtrl))
  return   0;
 rt=vGetVolumeValue(hmixer,&volCtrl)*MAX_VOL/volCtrl.Bounds.lMaximum;
 mixerClose(hmixer);
 return   rt;
}

BOOL CMyVolumeCtrl::vSetVolume(long   dev,long   vol)//设置设备的音量
{
 //   dev   =0,1,2       分别表示主音量,波形,MIDI   ,LINE   IN
 //   vol=0-MAX_VOL           表示音量的大小   ,   设置与返回音量的值用的是百分比,即音量从0   -   MAX_VOL,而不是设备的绝对值
 //   retrun   false   表示设置音量的大小的操作不成功
 //   retrun   true     表示设置音量的大小的操作成功
 long   device;
 BOOL   rc = FALSE;
 MIXERCONTROL   volCtrl;
 HMIXER   hmixer;
 switch   (dev)
 {
 case   1:
  device=MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT;   break;
 case   2:
  device=MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZER;   break;
 case   3:
  device=MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC;   break;
 default:
  device=MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
 }

 if(mixerOpen(&hmixer,   0,   0,   0,   0))   return   0;
 if(vGetVolumeControl(hmixer,device,MIXERCONTROL_CONTROLTYPE_VOLUME,&volCtrl))
 {
  vol=vol*volCtrl.Bounds.lMaximum/MAX_VOL;
  if(vSetVolumeValue(hmixer,&volCtrl,vol))
   rc=true;
 }
 mixerClose(hmixer);
 return   rc;
}

BOOL CMyVolumeCtrl::vSetMute(long   dev,long   vol)//设置设备静音
{
 //   dev   =0,1,2       分别表示主音量,波形,MIDI   ,LINE   IN
 //   vol=0,1             分别表示取消静音,设置静音
 //   retrun   false   表示取消或设置静音操作不成功
 //   retrun   true     表示取消或设置静音操作成功
 long   device;
 BOOL   rc = FALSE;
 MIXERCONTROL   volCtrl;
 HMIXER   hmixer;
 switch   (dev)
 {
 case   1:
  device=MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT;   break;
 case   2:
  device=MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZER;   break;
 case   3:
  device=MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC;   break;
 default:
  device=MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
 }

 if(mixerOpen(&hmixer,   0,   0,   0,   0))   return   0;
 if(vGetVolumeControl(hmixer,device,MIXERCONTROL_CONTROLTYPE_MUTE,&volCtrl))
  if(vSetMuteValue(hmixer,&volCtrl,(BOOL)vol))
   rc=TRUE;
 mixerClose(hmixer);
 return   rc;
}

BOOL CMyVolumeCtrl::vGetMute(long   dev)//检查设备是否静音
{
 //dev   =0,1,2     分别表示主音量,波形,MIDI   ,LINE   IN
 //retrun   false   表示没有静音
 //retrun   true     表示静音
 long   device;
 BOOL   rc = FALSE;
 MIXERCONTROL   volCtrl;
 HMIXER   hmixer;
 switch   (dev)
 {
 case   1:
  device=MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT;   break;
 case   2:
  device=MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZER;   break;
 case   3:
  device=MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC;   break;
 default:
  device=MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
 }

 if(mixerOpen(&hmixer,   0,   0,   0,   0))   return   0;
 if(vGetVolumeControl(hmixer,device,MIXERCONTROL_CONTROLTYPE_MUTE,&volCtrl)) rc = vGetMuteValue(hmixer,&volCtrl);
 mixerClose(hmixer);
 return   rc;
}

BOOL  CMyVolumeCtrl::vGetVolumeControl(HMIXER   hmixer   ,long   componentType,long   ctrlType,MIXERCONTROL*   mxc)
{
 MIXERLINECONTROLS   mxlc;
 MIXERLINE   mxl;
 mxl.cbStruct   =   sizeof(mxl);
 mxl.dwComponentType   =   componentType;
 if(!mixerGetLineInfo((HMIXEROBJ)hmixer,   &mxl,   MIXER_GETLINEINFOF_COMPONENTTYPE))
 {
  mxlc.cbStruct   =   sizeof(mxlc);
  mxlc.dwLineID   =   mxl.dwLineID;
  mxlc.dwControlType   =   ctrlType;
  mxlc.cControls   =   1;
  mxlc.cbmxctrl   =   sizeof(MIXERCONTROL);
  mxlc.pamxctrl   =   mxc;
 
  if(mixerGetLineControls((HMIXEROBJ)hmixer,&mxlc,MIXER_GETLINECONTROLSF_ONEBYTYPE))
   return   FALSE;
  else
   return   TRUE;
 }
 return   FALSE;
}

long CMyVolumeCtrl::vGetMuteValue(HMIXER   hmixer   ,MIXERCONTROL   *mxc)
{
 MIXERCONTROLDETAILS   mxcd;
 MIXERCONTROLDETAILS_BOOLEAN   mxcdMute;
 mxcd.hwndOwner   =   0;
 mxcd.cbStruct   =   sizeof(mxcd);
 mxcd.dwControlID   =   mxc-> dwControlID;
 mxcd.cbDetails   =   sizeof(mxcdMute);
 mxcd.paDetails   =   &mxcdMute;
 mxcd.cChannels   =   1;
 mxcd.cMultipleItems   =   0;
 if   (mixerGetControlDetails((HMIXEROBJ)hmixer,   &mxcd,MIXER_OBJECTF_HMIXER|MIXER_GETCONTROLDETAILSF_VALUE))
  return   -1;
 return   mxcdMute.fValue;
}

unsigned int CMyVolumeCtrl::vGetVolumeValue(HMIXER   hmixer   ,MIXERCONTROL   *mxc)
{
 MIXERCONTROLDETAILS   mxcd;
 MIXERCONTROLDETAILS_UNSIGNED   vol;   vol.dwValue=0;
 mxcd.hwndOwner   =   0;
 mxcd.cbStruct   =   sizeof(mxcd);
 mxcd.dwControlID   =   mxc-> dwControlID;
 mxcd.cbDetails   =   sizeof(vol);
 mxcd.paDetails   =   &vol;
 mxcd.cChannels   =   1;
 if(mixerGetControlDetails((HMIXEROBJ)hmixer,   &mxcd,   MIXER_OBJECTF_HMIXER|MIXER_GETCONTROLDETAILSF_VALUE))
  return   -1;
 return   vol.dwValue;
}

BOOL CMyVolumeCtrl::vSetMuteValue(HMIXER   hmixer   ,MIXERCONTROL   *mxc,   BOOL   mute)
{
 MIXERCONTROLDETAILS   mxcd;
 MIXERCONTROLDETAILS_BOOLEAN   mxcdMute;mxcdMute.fValue=mute;
 mxcd.hwndOwner   =   0;
 mxcd.dwControlID   =   mxc-> dwControlID;
 mxcd.cbStruct   =   sizeof(mxcd);
 mxcd.cbDetails   =   sizeof(mxcdMute);
 mxcd.paDetails   =   &mxcdMute;
 mxcd.cChannels   =   1;
 mxcd.cMultipleItems   =   0;
 if   (mixerSetControlDetails((HMIXEROBJ)hmixer,   &mxcd,   MIXER_OBJECTF_HMIXER|MIXER_SETCONTROLDETAILSF_VALUE))
  return   FALSE;
 return TRUE;
}

BOOL CMyVolumeCtrl::vSetVolumeValue(HMIXER   hmixer   ,MIXERCONTROL   *mxc,   long   volume)
{
 MIXERCONTROLDETAILS   mxcd;
 MIXERCONTROLDETAILS_UNSIGNED   vol;vol.dwValue   =   volume;
 mxcd.hwndOwner   =   0;
 mxcd.dwControlID   =   mxc-> dwControlID;
 mxcd.cbStruct   =   sizeof(mxcd);
 mxcd.cbDetails   =   sizeof(vol);
 mxcd.paDetails   =   &vol;
 mxcd.cChannels   =   1;
 if(mixerSetControlDetails((HMIXEROBJ)hmixer,   &mxcd,   MIXER_OBJECTF_HMIXER|MIXER_SETCONTROLDETAILSF_VALUE))
  return   FALSE;
 return   TRUE;
}

BOOL CMyVolumeCtrl::vInitEndPoint()
{
 if(m_pEndptVolCtrl != NULL) return FALSE;
 //g_EPVolEvents.SetCallback(fCallback); //set callback
 HRESULT hr = S_OK;
 CoInitialize(NULL);
 hr = CoCreateGuid(&m_guidMyContext);
 if(FAILED(hr)) return FALSE;
 // Get enumerator for audio endpoint devices.
 hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_INPROC_SERVER, __uuidof(IMMDeviceEnumerator), (void**)&m_pEnumerator);
 if(FAILED(hr)) return FALSE;
 // Get default audio-rendering device.
 hr = m_pEnumerator->GetDefaultAudioEndpoint(eRender, eConsole, &m_pDevice);
 if(FAILED(hr)) return FALSE;
 hr = m_pDevice->Activate(__uuidof(IAudioEndpointVolume), CLSCTX_ALL, NULL, (void**)&m_pEndptVolCtrl);
 if(FAILED(hr)) return FALSE;
 return TRUE;
}

BOOL CMyVolumeCtrl::vMuteSet(BOOL bMute)
{
 if(m_pEndptVolCtrl) m_pEndptVolCtrl->SetMute(bMute, &m_guidMyContext);
 return TRUE;
}

BOOL CMyVolumeCtrl::vMuteGet()
{
 BOOL bMute = FALSE;
 if(m_pEndptVolCtrl) m_pEndptVolCtrl->GetMute(&bMute);
 return bMute;
}

BOOL CMyVolumeCtrl::vVolumeSet(DWORD dwVolume)
{
 if((int)dwVolume < 0) dwVolume = 0;
 if((int)dwVolume > MAX_VOL) dwVolume = MAX_VOL;
 if(m_pEndptVolCtrl)
 {
  HRESULT hr = m_pEndptVolCtrl->SetMasterVolumeLevelScalar((float)dwVolume / MAX_VOL, &m_guidMyContext);
  return SUCCEEDED(hr) ? TRUE : FALSE;
 }
 return FALSE;
}

BOOL CMyVolumeCtrl::vVolumeGet(DWORD* pdwVolume)
{
 float fVolume;
 if(m_pEndptVolCtrl)
 {
  m_pEndptVolCtrl->GetMasterVolumeLevelScalar(&fVolume);
  if(pdwVolume != NULL) *pdwVolume =(DWORD)( MAX_VOL * fVolume + 0.5);
 }
 return TRUE;
}

BOOL CMyVolumeCtrl::vUninitEndPoint()
{
 SAFE_RELEASE(m_pEnumerator);
 SAFE_RELEASE(m_pDevice);
 SAFE_RELEASE(m_pEndptVolCtrl);
 CoUninitialize();
 return TRUE;
}

WindowsType CMyVolumeCtrl::vGetWindowsType()
{
 OSVERSIONINFO info;
 ZeroMemory(&info, sizeof(OSVERSIONINFO));
 info.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
 WindowsType eType = UnknownOS;
 if(GetVersionEx(&info))
 {
  TRACE("GetVersionEx: MajorVer = %d, MinVer = %d, BuildNo = %d", info.dwMajorVersion, info.dwMinorVersion, info.dwBuildNumber);
  if(info.dwMajorVersion <= 5)//XP or early
   eType = WindowsXP;
  else
  {
   if(info.dwMinorVersion == 0)
    eType = WindowsVista;
   else
    eType = Windows7;
  }
 }
 return eType;
}
  评论这张
 
阅读(1604)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017