如何在vista下控制系统音量 c++builder2007开发

iamhaiergg 2008-10-29 07:39:48
如何在vista下控制系统音量 c++builder2007开发
...全文
454 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
iamhaiergg 2008-11-06
  • 打赏
  • 举报
回复
以上是VC++的实现方法 有人能帮我改成BCB的吗 多谢了
iamhaiergg 2008-11-06
  • 打赏
  • 举报
回复
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 ) )
{
// AfxMessageBox( L" Get interface IMMDevice failed!" );
return FALSE;
}

IAudioEndpointVolume* m_AudioEndpointVolume = NULL;

hr = m_pDeviceOut->Activate(__uuidof(IAudioEndpointVolume),CLSCTX_ALL,NULL,(void**)&m_AudioEndpointVolume);
if ( FAILED( hr ) )
{
// AfxMessageBox( L" Get interface IMMDevice failed!" );
return FALSE;
}

IAudioClient* pAudioClient = NULL;
hr = m_pDeviceOut->Activate( __uuidof(IAudioClient), CLSCTX_ALL, NULL, (void**)&pAudioClient );
if ( FAILED( hr ) )
{
// AfxMessageBox( L" Get interface IAudioClient failed!" );
return FALSE;
}

UINT uStep = 0;
UINT uStepCount = 0;
hr = m_AudioEndpointVolume->GetVolumeStepInfo( &uStep, &uStepCount );
if ( FAILED( hr ) )
{
// AfxMessageBox( L" Get interface GetVolumeStepInfo failed!" );
return FALSE;
}


uVol = ( uStep * 100 ) / uStepCount;

return TRUE;
}
iamhaiergg 2008-11-06
  • 打赏
  • 举报
回复
void
SetVolumnVista( UINT nInputStep )
{
IMMDeviceEnumerator* m_pEnumerator = NULL;

HRESULT hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL,

CLSCTX_ALL, __uuidof(IMMDeviceEnumerator),

(void**)&m_pEnumerator);

if ( FAILED( hr ) )
{
AfxMessageBox( L" Get interface IMMDeviceEnumerator failed!" );
return;
}

IMMDevice* m_pDeviceOut = NULL;
hr = m_pEnumerator->GetDefaultAudioEndpoint(eRender, eMultimedia, &m_pDeviceOut);

if ( FAILED( hr ) )
{
AfxMessageBox( L" Get interface IMMDevice failed!" );
return;
}

IAudioEndpointVolume* m_AudioEndpointVolume = NULL;

hr = m_pDeviceOut->Activate(__uuidof(IAudioEndpointVolume),CLSCTX_ALL,NULL,(void**)&m_AudioEndpointVolume);
if ( FAILED( hr ) )
{
AfxMessageBox( L" Get interface IMMDevice failed!" );
return;
}

IAudioClient* pAudioClient = NULL;
hr = m_pDeviceOut->Activate( __uuidof(IAudioClient), CLSCTX_ALL, NULL, (void**)&pAudioClient );
if ( FAILED( hr ) )
{
AfxMessageBox( L" Get interface IAudioClient failed!" );
return;
}

UINT uStep = 0;
UINT uStepCount = 0;
hr = m_AudioEndpointVolume->GetVolumeStepInfo( &uStep, &uStepCount );
if ( FAILED( hr ) )
{
AfxMessageBox( L" Get interface GetVolumeStepInfo failed!" );
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 ) )
{
AfxMessageBox( L" Get interface VolumeStepUp failed!" );
return;
}
}
}
hemiya 2008-11-06
  • 打赏
  • 举报
回复
mark
wellerweldon 2008-11-05
  • 打赏
  • 举报
回复
mark
iamhaiergg 2008-10-30
  • 打赏
  • 举报
回复
没人跟贴 自己顶、
yumikoo 2008-10-29
  • 打赏
  • 举报
回复

//---------------------------------------------------------------------------

bool WINAPI SetVolume(long dev,long vol)//设置设备的音量
{
// dev =0,1,2 分别表示主音量,波形,MIDI ,LINE IN
// vol=0-100 表示音量的大小 , 设置与返回音量的值用的是百分比,即音量从0 - 100,而不是设备的绝对值
// 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(GetVolumeControl(hmixer,device,MIXERCONTROL_CONTROLTYPE_VOLUME,&volCtrl))
{
vol=vol*volCtrl.Bounds.lMaximum/100;
if(SetVolumeValue(hmixer,&volCtrl,vol))
rc=true;
}
mixerClose(hmixer);
return rc;
}

//---------------------------------------------------------------------------

bool WINAPI SetMute(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(GetVolumeControl(hmixer,device,MIXERCONTROL_CONTROLTYPE_MUTE,&volCtrl))
if(SetMuteValue(hmixer,&volCtrl,(bool)vol))
rc=true;
mixerClose(hmixer);
return rc;
}

//---------------------------------------------------------------------------

bool WINAPI GetMute(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(GetVolumeControl(hmixer,device,MIXERCONTROL_CONTROLTYPE_MUTE,&volCtrl))
rc=GetMuteValue(hmixer,&volCtrl);
mixerClose(hmixer);
return rc;

}


使用:
//调节音量
void __fastcall TForm1::TrackBar0Change(TObject *Sender)
{
SetVolume(0,TrackBar0->Position*10);
}

//静音
void __fastcall TForm1::CheckBox0Click(TObject *Sender)
{
SetMute(0,CheckBox0->Checked);
}
yumikoo 2008-10-29
  • 打赏
  • 举报
回复

//----------------------------设定音量---------------------------------------

bool GetVolumeControl(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 0;
else
return 1;
}
return 0;
}
//---------------------------------------------------------------------------
long GetMuteValue(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 GetVolumeValue(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 SetMuteValue(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 0;
return 1;
}

//---------------------------------------------------------------------------

bool SetVolumeValue(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 0;
return 1;
}


//---------------------------------------------------------------------------
unsigned WINAPI GetVolume(int dev)//得到设备的音量dev=0主音量,1WAVE ,2MIDI ,3 LINE IN
{

long device;unsigned 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(!GetVolumeControl(hmixer,device,MIXERCONTROL_CONTROLTYPE_VOLUME,&volCtrl))
return 0;
rt=GetVolumeValue(hmixer,&volCtrl)*100/volCtrl.Bounds.lMaximum;
mixerClose(hmixer);
return rt;

}




iamhaiergg 2008-10-29
  • 打赏
  • 举报
回复
或有人教我如何快速有效的查阅微软的技术文档也可以, 本人不是很会用,。。。。
iamhaiergg 2008-10-29
  • 打赏
  • 举报
回复
谢谢你的指教, 不过请问楼上的代码在vista系统下测试过吗? 我在vista系统下测试 主音量没有变化!!!

604

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder VCL组件使用和开发
社区管理员
  • VCL组件使用和开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧