2011-01-07 62 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