比如我现在放一首mp3,电脑的音量肯定时刻在变化,我怎么才能够查询出当前的音量呢?我说的音量不是只右下角那个黄色小喇叭可以调节的那个音量,那个音量如果你不去动他,基本上是固定不变的。windows有没有提供什么api完成上面的功能的呢?

解决方案 »

  1.   

    MMRESULT            mmr;
    HMIXER              m_hmx;
    MIXERCAPS           m_mxcaps;
    MIXERLINE           m_mxl;
    MIXERLINECONTROLS   m_mxlc;
    MIXERCONTROL        m_mxctrl;
    ULONG cConnections,v;
    mmr = mixerGetDevCaps(0, &m_mxcaps, sizeof(m_mxcaps));
    if (MMSYSERR_NOERROR != mmr)
    {
    MessageBox("Can't Get Device Caps.");
    return TRUE;
    }
    mmr = mixerOpen(&m_hmx, 0, (DWORD)m_hWnd, 0L, CALLBACK_WINDOW);
    if (MMSYSERR_NOERROR != mmr)
    {
    MessageBox("Can't Open Mixer Device.");
    return TRUE;
    }
    m_mxl.cbStruct      = sizeof(m_mxl);
    m_mxl.dwDestination = 0;
    mmr = mixerGetLineInfo((HMIXEROBJ)m_hmx, &m_mxl, MIXER_GETLINEINFOF_DESTINATION);
    if (MMSYSERR_NOERROR != mmr)
    {
    MessageBox("Can't Get Mixer Device Line Info For Volume Controls");
    return TRUE;
    }
    cConnections=m_mxl.cConnections;
    m_mxlc.cbStruct       = sizeof(m_mxlc);
    m_mxlc.dwLineID       = m_mxl.dwLineID;
    m_mxlc.cControls      = m_mxl.cControls;
    m_mxlc.cbmxctrl       = sizeof(m_mxctrl);
    m_mxlc.dwControlType  = MIXERCONTROL_CONTROLTYPE_VOLUME;
    m_mxlc.pamxctrl       = &m_mxctrl;
    mmr = mixerGetLineControls((HMIXEROBJ)m_hmx, &m_mxlc, MIXER_GETLINECONTROLSF_ONEBYTYPE);
    if (MMSYSERR_NOERROR != mmr)
    {
    MessageBox("Can't Get Line Info For Volume Controls");
    return TRUE;
    }
      

  2.   

    音量值是保存在m_mxlc中吗?
    但是我MSDN查了一下,没有发现m_mxlc中那个成员表示音量的.
      

  3.   

    m_mxlc 是MIXERLINECONTROLS变量,你查询MIXERLINECONTROLS结构
      

  4.   

    是放在MIXERLINECONTROLS的LPMIXERCONTROL pamxctrl成员中吗? pamxctrl是一个MIXERCONTROL结构,但是MIXERCONTROL中也没有发现有音量的属性啊.还请教大侠~~
      

  5.   

    好像出了点问题.mmr = mixerOpen(&m_hmx, 0, (DWORD)m_hWnd, 0L, CALLBACK_WINDOW);
    一句中m_hWnd是必须的吗? 我最终的程序是控制台程序,没有窗口怎么办?还有m_mxctrl.Metrics.cbCustomData我估计就是音量了,但是为什么无论我放什么mp3, 其值总为192啊, 不明白为什么~~~
      

  6.   

    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;
    http://search.csdn.net/Expert/topic/1431/1431476.xml?temp=.8853113
      

  7.   

    用低级音频函数。
    waveInGetNumDevs(); 
    waveInGetDevCaps (0, &m_WaveInDevCaps, sizeof(WAVEINCAPS));}
    WaveInitFormat(1/* mono*/,m_WaveInSampleRate /* khz */,16 /* bits */); 
    waveInOpen( &m_WaveIn,0, &m_WaveFormat,(DWORD)
    waveInPrepareHeader( m_WaveIn, &m_WaveHeader, sizeof(WAVEHDR) ); }
    waveInAddBuffer( m_WaveIn, &m_WaveHeader, sizeof(WAVEHDR) );
    waveInStart( m_WaveIn );
    www.csdn.net/develop/Read_Article.asp?Id=9780 
      

  8.   

    用低级音频函数。
    waveInGetNumDevs(); 
    waveInGetDevCaps (0, &m_WaveInDevCaps, sizeof(WAVEINCAPS));}
    WaveInitFormat(1/* mono*/,m_WaveInSampleRate /* khz */,16 /* bits */); 
    waveInOpen( &m_WaveIn,0, &m_WaveFormat,(DWORD)
    waveInPrepareHeader( m_WaveIn, &m_WaveHeader, sizeof(WAVEHDR) ); }
    waveInAddBuffer( m_WaveIn, &m_WaveHeader, sizeof(WAVEHDR) );
    waveInStart( m_WaveIn );
    www.csdn.net/develop/Read_Article.asp?Id=9780 除此之外,还要将录音源设置为“Mixer Out”或者是“Wave Out”