当其它程序调节系统中设备的音量时,Windows自带的音量调节器Slider会即时出现相应变化。它是用了callback还是用message?

解决方案 »

  1.   

    应该消息,
    不然不会同步改变的—————————————————————————————————
    ┏━★━━◆━━★━┓ 
    ♂欢|◢CSDN◣|使♂        ▲自由保存帖子,浏览,关注检测
    ┃迎|◥论坛助手◤|用┃        ▲完善的CSDN客户端工具
    ┗━☆━━◇━━━☆┛       ▲自动添加签名......让你更快,更爽,更方便地上CSDN...
    http://www.csdn.net/expert/topic/573/573604.xml
    http://www.chinaok.net/csdn/csdn.zip
      

  2.   

    BOOL setVol(BOOL up)
    { HMIXER m_HMixer;
    INT m_iMixerControlID;
    MMRESULT mmr;
    DWORD m_dwChannels;
    BOOL m_bSuccess;
    DWORD SrcType,DstType,ControlType;
    MIXERLINE mxl;
    MIXERCONTROL mxc;
    MIXERLINECONTROLS mxlc;
    MIXERCONTROLDETAILS mxcd;
    MIXERCONTROLDETAILS_UNSIGNED mxcd_u[2];
    UINT nconn;
    DWORD DstIndex;
    UINT j;
    HWND hwnd;
    // CHAR aaa[123]; SrcType=NO_SOURCE;
    DstType=MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
    ControlType=MIXERCONTROL_CONTROLTYPE_VOLUME;
    m_HMixer = NULL;
    m_iMixerControlID = 0;
    mmr = MMSYSERR_NOERROR;
    m_dwChannels = 0;
    m_bSuccess = FALSE;
    if(mixerGetNumDevs() < 1) return 0;
    mmr = mixerOpen(&m_HMixer, 0, 0, 0L, CALLBACK_NULL);
    if (mmr != MMSYSERR_NOERROR) return 0;
    // get dwLineID
    mxl.cbStruct = sizeof(MIXERLINE);
    // DstType
    mxl.dwComponentType = DstType;
    if (mixerGetLineInfo((HMIXEROBJ)m_HMixer, &mxl, MIXER_OBJECTF_HMIXER | MIXER_GETLINEINFOF_COMPONENTTYPE)
    != MMSYSERR_NOERROR) return 0;
    // SrcType
    if( SrcType != NO_SOURCE )
    {
    nconn = mxl.cConnections;
    DstIndex = mxl.dwDestination;
    for(j = 0; j < nconn; j++ )
    {
    mxl.cbStruct = sizeof( MIXERLINE );
    mxl.dwSource = j;
    mxl.dwDestination = DstIndex;
    if(mixerGetLineInfo( ( HMIXEROBJ )m_HMixer,
    &mxl, MIXER_GETLINEINFOF_SOURCE ) != MMSYSERR_NOERROR) return 0;
    if( mxl.dwComponentType == SrcType ) break;
    }
    }
    // get dwControlID
    mxlc.cbStruct = sizeof(MIXERLINECONTROLS);
    mxlc.dwLineID = mxl.dwLineID;
    mxlc.dwControlType = ControlType;
    mxlc.cControls = 1;
    mxlc.cbmxctrl = sizeof(MIXERCONTROL);
    mxlc.pamxctrl = &mxc;
    if (mixerGetLineControls((HMIXEROBJ)m_HMixer, &mxlc, MIXER_OBJECTF_HMIXER | MIXER_GETLINECONTROLSF_ONEBYTYPE) != MMSYSERR_NOERROR) return 0;
    m_iMixerControlID = mxc.dwControlID;
    m_dwChannels = mxl.cChannels;
    m_bSuccess = TRUE; if (!m_bSuccess) return m_bSuccess;
    m_bSuccess = FALSE;
    mxcd.cbStruct = sizeof(mxcd);
    mxcd.dwControlID = m_iMixerControlID;
    mxcd.cChannels = m_dwChannels;
    mxcd.cMultipleItems = 0;
    mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_UNSIGNED);
    mxcd.paDetails = mxcd_u;
    mmr = mixerGetControlDetails((HMIXEROBJ)m_HMixer, &mxcd, 0L);
    if (MMSYSERR_NOERROR != mmr) return m_bSuccess;// wsprintf(aaa,"%d",mxcd_u[0].dwValue);
    // MessageBox(NULL, aaa, "l", MB_OK); hwnd=FindWindow(PROGRESS_CLASS, NULL);
    // SetFocus(hwnd);
    ShowWindow(hwnd, SW_SHOW);
    // ShowWindow(hwnd, SW_SHOWNA);
    if (!isWin2000)
    {
    if (up)
    {
    if (mxcd_u[0].dwValue > (65535-1024)) 
    mxcd_u[0].dwValue=65535;
    else
    mxcd_u[0].dwValue  = mxcd_u[0].dwValue + 1024;
    // if (mxcd_u[0].dwValue < 1024) mxcd_u[0].dwValue=65435;
    mxcd_u[1].dwValue  = mxcd_u[0].dwValue;
    }
    else
    {
    if (mxcd_u[0].dwValue < 1024) 
    mxcd_u[0].dwValue=0;
    else
    mxcd_u[0].dwValue  = mxcd_u[0].dwValue - 1024;
    mxcd_u[1].dwValue  = mxcd_u[0].dwValue;
    }
    mxcd.paDetails = mxcd_u;
    mmr = mixerSetControlDetails((HMIXEROBJ)m_HMixer, &mxcd, 0L);
    // wsprintf(aaa,"%d",mmr);
    // MessageBox(NULL, aaa, "l", MB_OK);
    if (MMSYSERR_NOERROR != mmr) return m_bSuccess;
    }
    /***********************************************************************************/// FindWindow("","Change Volume");
    dwVolValue = mxcd_u[0].dwValue;
    hwnd=FindWindow(myKTREXE_WNDCLASS_NAME,myKTREXE_APPWND_NAME);
    if (hwnd)
    SendMessageCallback(hwnd,WM_COMMAND,22222,dwVolValue,0,0);
    // SendMessage(hwnd,WM_COMMAND,22222,dwVolValue);
    /***********************************************************************************/ if (m_HMixer) mixerClose(m_HMixer);
    if (MMSYSERR_NOERROR != mmr) return m_bSuccess;
    m_bSuccess = TRUE;
    return m_bSuccess;}