2011-01-07 59 views
0

我知道很多人问这个问题,但我没有看到任何答案,有没有lib /一种通用的GET方法没有设置,我不需要它)为xp/vista/seven工作的主音量(当前声音输出源的音量,而不是声音的音量)?在Windows XP/Vista/7中获取主音量(通常通过键盘滚轮增加一个音量)

如果没有,如何做到这一点的XP,VISTA,七(我会写我的通用包装)

我需要出示条(进度条)来说明如何设置当前卷(的winform控制)

编辑:

我发现了一个有用的链接,我测试它,但我不会检查答案“,我拿东西的作品 http://www.codeproject.com/KB/audio-video/mixerSetControlDetails.aspx?display=Print

编辑2:

一个重要的事情:分析量将不会在Windows Vista上工作或更高版本之前的方式,用这个来代替LIB: http://www.codeproject.com/KB/vista/CoreAudio.aspx

我不知道,如果真的效果很好,因为我目前没有vista/seven

回答

1

请问mixerGetNumDevs和相关的API有帮助吗? (你必须要经过的所有设备与mixerGetLineControls等,看看哪些MIXERCONTROL说:“卷”为姓;还有一种方法可以检查该标志这就是你要找的人。)


编辑:

这是我有一些旧代码的片段;我不认为它编译,它不是伟大的代码(我只需要完成的东西),但它应该是有帮助的:

MMRESULT mmResult = mixerOpen(&hMixer, 0, (DWORD_PTR)hWnd, NULL, CALLBACK_WINDOW | MIXER_OBJECTF_MIXER); 
if (MMSYSERR_NOERROR == mmResult) 
{ 
    MIXERLINE mxl; 
    mxl.cbStruct = sizeof(MIXERLINE); 
    mxl.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_SPEAKERS; 
    MMRESULT mmResult = mixerGetLineInfo((HMIXEROBJ)hMixer, &mxl, MIXER_OBJECTF_HMIXER | MIXER_GETLINEINFOF_COMPONENTTYPE); 
    if (mmResult == MMSYSERR_NOERROR) 
    { 
     MIXERLINECONTROLS controls; 
     memzero(&controls, sizeof(controls)); 
     controls.cbStruct = sizeof(controls); 
     controls.cControls = 1; 
     controls.dwLineID = mxl.dwLineID; 
     controls.cbmxctrl = sizeof(MIXERCONTROL); //one element only!! 
     MIXERCONTROL controlsArray[2]; //First element: volume, second element: mixer 
     memzero(&controlsArray, sizeof(controlsArray)); 
     for (int i = 0; i < sizeof(controlsArray)/sizeof(*controlsArray); i++) { controlsArray[0].cbStruct = sizeof(controlsArray[0]); } 

     controls.dwControlType = MIXERCONTROL_CONTROLTYPE_VOLUME; 
     controls.pamxctrl = &controlsArray[0]; //NOTE: this is ZERO 
     mmResult = mixerGetLineControls((HMIXEROBJ)hMixer, &controls, MIXER_GETLINECONTROLSF_ONEBYTYPE | MIXER_OBJECTF_HMIXER); 
     if (mmResult == MMSYSERR_NOERROR) 
     { 
      controls.dwControlType = MIXERCONTROL_CONTROLTYPE_MUTE; 
      controls.pamxctrl = &controlsArray[1]; //NOTE: this is ONE 
      mmResult = mixerGetLineControls((HMIXEROBJ)hMixer, &controls, MIXER_GETLINECONTROLSF_ONEBYTYPE | MIXER_OBJECTF_HMIXER); 
      if (mmResult == MMSYSERR_NOERROR) 
      { 
       bool isVolume = controls[0].dwControlID == (DWORD)lParam; 
       bool isMute = controls[1].dwControlID == (DWORD)lParam; 
       if (isVolume | isMute) 
       { 
        MIXERCONTROLDETAILS details; 
        memzero(&details, sizeof(details)); 
        details.cbStruct = sizeof(details); 
        details.cChannels = 1; 
        details.dwControlID = (DWORD)lParam; 
        MIXERCONTROLDETAILS_UNSIGNED controlDetail; 
        memzero(&controlDetail, sizeof(controlDetail)); 
        details.paDetails = &controlDetail; 
        details.cbDetails = sizeof(controlDetail); 
        MMRESULT mmResult = mixerGetControlDetails((HMIXEROBJ)hMixer, &details, MIXER_GETCONTROLDETAILSF_VALUE | MIXER_OBJECTF_HMIXER); 
        if (mmResult == MMSYSERR_NOERROR) 
        { 
        } 
       } 
      } 
     } 
    } 
} 
+0

我不知道它是否有效(好吧,我是新手到这个论点),它也可以在vista/seven上运行吗? – 2011-01-07 21:31:48