这段函数在dll里,在xp下可以设置音量,到了win7同样可以获取音量值,但是获取的值不是扬声器的,
也不清楚获取的是什么值,但仍可以设置某设置(就是不知道什么设备 = = )的音量,具体代码如下,麻烦大虾们指点迷津环境:vs2010中文版 win7 
编码:多字符集
MMRESULT rc; // Return code.
HMIXER hMixer; // Mixer handle used in mixer API calls.
MIXERCONTROL mxc; // Holds the mixer control data.
MIXERLINE mxl; // Holds the mixer line data.
MIXERLINECONTROLS mxlc; // Obtains the mixer control.
 
//打开mixer. 单声卡的deviceID为0.//
rc = mixerOpen(&hMixer,0,0,0,0);
if (MMSYSERR_NOERROR != rc) 
{
return false;
} //初始化MIXERLINE结构体//
//ZeroMemory(&mxl,sizeof(MIXERLINE));
mxl =  MIXERLINE();
mxl.cbStruct = sizeof(MIXERLINE);

//指出需要获取的通道,扬声器用MIXERLINE_COMPONENTTYPE_DST_SPEAKERS//
mxl.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_SPEAKERS; rc = mixerGetLineInfo((HMIXEROBJ)hMixer, &mxl,
MIXER_GETLINEINFOF_COMPONENTTYPE);
if (MMSYSERR_NOERROR != rc) 
{
return false;
} //取得控制器//
//ZeroMemory(&mxlc, sizeof(MIXERLINECONTROLS));
mxc = MIXERCONTROL();
mxc.cbStruct = sizeof(MIXERCONTROL);  mxlc = MIXERLINECONTROLS();
mxlc.cbStruct = sizeof(MIXERLINECONTROLS);
mxlc.dwLineID = mxl.dwLineID;
mxlc.dwControlType = MIXERCONTROL_CONTROLTYPE_VOLUME;
mxlc.cControls = 1;
mxlc.cbmxctrl = sizeof(MIXERCONTROL);
mxlc.pamxctrl = &mxc;


rc = mixerGetLineControls((HMIXEROBJ)hMixer,&mxlc,
MIXER_GETLINECONTROLSF_ONEBYTYPE);
if (MMSYSERR_NOERROR != rc) 
{
return false;
}

// 获取控制器中的值的音量
MIXERCONTROLDETAILS mxcd; // Gets the control values.
MIXERCONTROLDETAILS_SIGNED volStruct; // Gets the control values.
long volume; // Holds the final volume value. //初始化MIXERCONTROLDETAILS结构体//
//ZeroMemory(&mxcd, sizeof(MIXERCONTROLDETAILS));
mxcd =  MIXERCONTROLDETAILS();
volStruct =  MIXERCONTROLDETAILS_SIGNED();
mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS);
mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_SIGNED);
mxcd.dwControlID = mxc.dwControlID;
mxcd.paDetails = &volStruct;
mxcd.cChannels = 1;
//mxcd.cMultipleItems = 0; // 获得音量值
rc = mixerGetControlDetails((HMIXEROBJ)hMixer, &mxcd,
MIXER_GETCONTROLDETAILSF_VALUE);
if (MMSYSERR_NOERROR != rc) 
{
return false;
}
volume = volStruct.lValue;//当前音量值//        //处理音量//
volStruct.lValue = volume +1311;
rc = mixerSetControlDetails((HMIXEROBJ)hMixer, &mxcd,
MIXER_SETCONTROLDETAILSF_VALUE); 
return true;

解决方案 »

  1.   

    秘诀!
    1、WIN7不稳定,许多API不能用
    2、正版WIN7一定要加权限控制,即:你的程序运行的时候只要调用系统API,那么WIN7就会弹出一个是否以管理员权限运行的通知,至于怎么去设置这个权限,你可以在VC工程--属性--清单工具(就是Manifest文件生成)依赖项里面选择  RequireAdministrator   ,如果没有这个选项,你就要手动添加信息到manifest文件中,具体怎么做你去microsoft 论坛搜索吧,呵呵
      

  2.   

    楼上的,我写在dll里的.自己顶一下,大虾们帮帮忙啊.
      

  3.   

    Vista之后每个程序都有自己的音量设置
    要设置全局的音量的话用ISimpleAudioVolume::SetMasterVolume
      

  4.   

    谢谢3L指点,结果用了IAudioEndpointVolume 搞定了.连接如下:
    http://msdn.microsoft.com/en-us/library/dd370839(v=VS.85).aspx结贴.