自己AP中要获取系统的音量值,不知如何实现?

解决方案 »

  1.   

    你可以用以下程序试试:    MMRESULT          rc;     // 多媒体函数返回结果变量
        HMIXER            hMixer; // 混合器设备句柄
        MIXERLINE         mxl;    // 音频线路标准状态信息结构体
        MIXERLINECONTROLS mxlc;   // 音频线路控制器集合信息结构体
        MIXERCONTROL      mxc;    // 单个音频线路控制器信息结构体    // 打开混合器设备
        rc = mixerOpen(&hMixer, // 返回的设备句柄
                       0,       // 单声卡的设备ID为零
                       0,       // 不使用回调机制
                       0,       // 回调函数参数
                       0);      // MIXER_OBJECTF_MIXER宏的值,表示任选有效设备ID    // 打开混合器设备无错的话,则
        if (MMSYSERR_NOERROR == rc)
        {
            // MIXERLINE 结构体变量清零
            ZeroMemory(&mxl, sizeof(MIXERLINE));        mxl.cbStruct = sizeof(MIXERLINE); // 微软用此办法判断版本
            // 指出需要获取的通道,声卡的音频输出用MIXERLINE_COMPONENTTYPE_DST_SPEAKERS
            mxl.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
            
            // 取得混合器设备的指定线路信息
            rc = mixerGetLineInfo((HMIXEROBJ)hMixer,
                                  &mxl,
                                  // 取得MIXERLINE::dwComponentType指定类型的第一个音频线路信息
                                  MIXER_GETLINEINFOF_COMPONENTTYPE);
           
            // 取得混合器设备的指定线路信息成功的话,则
            if (MMSYSERR_NOERROR == rc)
            {
                // MIXERCONTROL 结构体变量清零
                ZeroMemory(&mxc, sizeof(MIXERCONTROL));            mxc.cbStruct = sizeof(mxc); // 微软用此办法判断版本            // MIXERLINECONTROLS 结构体变量清零
                ZeroMemory(&mxlc, sizeof(MIXERLINECONTROLS));
              
                mxlc.cbStruct = sizeof(mxlc); // 微软用此办法判断版本            mxlc.dwLineID = mxl.dwLineID; // 上面取得的声卡音频输出线路标识
                // 控制类型为控制音量
                mxlc.dwControlType = MIXERCONTROL_CONTROLTYPE_VOLUME;
                mxlc.cControls = 1;          // 使用 MIXERCONTROL 结构体变量个数
                mxlc.pamxctrl = &mxc;        // MIXERCONTROL 结构体变量指针
                mxlc.cbmxctrl = sizeof(mxc); // MIXERCONTROL 结构体变量字节大小
               
                // 取得控制器信息
                rc = mixerGetLineControls((HMIXEROBJ)hMixer,
                                          &mxlc,
                                          MIXER_GETLINECONTROLSF_ONEBYTYPE);            // 取得控制器信息成功的话,则
                if (MMSYSERR_NOERROR == rc)
                {
                    // 获取控制器中的值的音量范围:mxc.Bounds.lMinimum到mxc.Bounds.lMaximum.
                    MIXERCONTROLDETAILS        mxcd;      // 控制器的状态信息
                    MIXERCONTROLDETAILS_SIGNED volStruct; // 音量结构体变量(就一个成员量)                // MIXERCONTROLDETAILS 结构体变量清零
                    ZeroMemory(&mxcd, sizeof(mxcd));                mxcd.cbStruct = sizeof(mxcd);       // 微软用此办法判断版本
                    mxcd.dwControlID = mxc.dwControlID; // 上面取得的控制器标识
                    mxcd.paDetails = &volStruct;        // 音量结构体变量指针
                    mxcd.cbDetails = sizeof(volStruct); // 音量结构体变量字节大小
                    mxcd.cChannels = 1;                 // 取得或设置全部通道
                        // 获得音量值
                        rc = mixerGetControlDetails((HMIXEROBJ)hMixer,
                                                    &mxcd,
                                                    MIXER_GETCONTROLDETAILSF_VALUE);                    if (MMSYSERR_NOERROR == rc)
                        {
                            CString str = "";                        str.Format("音量:%X", volStruct.lValue);                        AfxMessageBox(str);
                        }
                }
            }
        }
      

  2.   

    试过以上程序,在WIN7下得不到系统的实际音量值,哪位大大能指点下吗?
      

  3.   

    CMyVolumeCtrl是用MFC的。我的是SDK的,不知有人这样实现过吗?
      

  4.   

    http://cache.baidu.com/c?m=9d78d513d99c15fe4fece4697c1cc0111c43f0102ba6a7027ea48438e3732f425017e9ac54210705a3d20d1316df4e4b9b862102361421c78cbe885da9bd85592c9f5740645bc61f1d895fe9895124b23d8d0ab7f24cf0ba8763d2f88ec4df230f9d15183ad7a5de01574d9131ae4371fef5d90e4e0e4eedf06632b90a2c77de3e47bd44f9ea3769&p=80769a4e9c9a11a05bea90655b55c1&user=baidu&fm=sc&query=MFC%C8%E7%BA%CE%BB%F1%C8%A1%CF%B5%CD%B3%D2%F4%C1%BF&qid=b252f91d10c8ea3f&p1=3
    可能有你要的,我也不太懂!没做过