怎样控制系统总音量?
分不够可以加!
最好有代码
谢谢咯!

解决方案 »

  1.   

    uses MMSystem, Dialogs;Type
      TDeviceName = (Master, Microphone, WaveOut, Synth);//设置音量
    procedure setVolume(DN:TDeviceName; Value : Word);
    var
      hMix: HMIXER;
      mxlc: MIXERLINECONTROLS;
      mxcd: TMIXERCONTROLDETAILS;
      vol: TMIXERCONTROLDETAILS_UNSIGNED;
      mxc: MIXERCONTROL;
      mxl: TMixerLine;
      intRet: Integer;
      nMixerDevs: Integer;
    begin
      // Check if Mixer is available
      nMixerDevs := mixerGetNumDevs();
      if (nMixerDevs < 1) then Exit;
      // open the mixer
      intRet := mixerOpen(@hMix, 0, 0, 0, 0);
      if intRet = MMSYSERR_NOERROR then begin
        case DN of
          Master     : mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
          Microphone : mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE;
          WaveOut    : mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT;
          Synth      : mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZER;
        end;
        mxl.cbStruct := SizeOf(mxl);
        // get line info
        intRet := mixerGetLineInfo(hMix, @mxl, MIXER_GETLINEINFOF_COMPONENTTYPE);
        if intRet = MMSYSERR_NOERROR then begin
          FillChar(mxlc, SizeOf(mxlc),0);
          mxlc.cbStruct := SizeOf(mxlc);
          mxlc.dwLineID := mxl.dwLineID;
          mxlc.dwControlType := MIXERCONTROL_CONTROLTYPE_VOLUME;
          mxlc.cControls := 1;
          mxlc.cbmxctrl := SizeOf(mxc);
          mxlc.pamxctrl := @mxc;
          intRet := mixerGetLineControls(hMix, @mxlc, MIXER_GETLINECONTROLSF_ONEBYTYPE);
          if intRet = MMSYSERR_NOERROR then begin
            FillChar(mxcd, SizeOf(mxcd),0);
            mxcd.dwControlID := mxc.dwControlID;
            mxcd.cbStruct := SizeOf(mxcd);
            mxcd.cMultipleItems := 0;
            mxcd.cbDetails := SizeOf(Vol);
            mxcd.paDetails := @vol;
            mxcd.cChannels := 1;
            vol.dwValue := Value;
            intRet := mixerSetControlDetails(hMix, @mxcd,MIXER_SETCONTROLDETAILSF_VALUE);
            if intRet <> MMSYSERR_NOERROR then
              ShowMessage('SetControlDetails Error');
          end else
            ShowMessage('GetLineInfo Error');
        end;
        mixerClose(hMix);
      end;
    end;
      

  2.   

    我调用了setVolume(Master, 123);
    可是总音量为0
    是怎么回事?
      

  3.   

    123太小了试试setVolume(Master, $FFFF);
      

  4.   

    感谢 belllab(菜鸟) 的代码,我也正在找它呢。
      

  5.   

    //获取音量
    function GetVolume(DN:TDeviceName) : Word;
    var
      hMix: HMIXER;
      mxlc: MIXERLINECONTROLS;
      mxcd: TMIXERCONTROLDETAILS;
      vol: TMIXERCONTROLDETAILS_UNSIGNED;
      mxc: MIXERCONTROL;
      mxl: TMixerLine;
      intRet: Integer;
      nMixerDevs: Integer;
    begin
      Result:=0;
      // Check if Mixer is available
      nMixerDevs := mixerGetNumDevs();
      if (nMixerDevs < 1) then Exit;
      // open the mixer
      intRet := mixerOpen(@hMix, 0, 0, 0, 0);
      if intRet = MMSYSERR_NOERROR then begin
        case DN of
          Master     :  mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
          Microphone :  mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE;
          WaveOut    : mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT;
          Synth      :  mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZER;
        end;
        mxl.cbStruct := SizeOf(mxl);
        // get line info
        intRet := mixerGetLineInfo(hMix, @mxl, MIXER_GETLINEINFOF_COMPONENTTYPE);
        if intRet = MMSYSERR_NOERROR then begin
          FillChar(mxlc, SizeOf(mxlc),0);
          mxlc.cbStruct := SizeOf(mxlc);
          mxlc.dwLineID := mxl.dwLineID;
          mxlc.dwControlType := MIXERCONTROL_CONTROLTYPE_VOLUME;
          mxlc.cControls := 1;
          mxlc.cbmxctrl := SizeOf(mxc);
          mxlc.pamxctrl := @mxc;
          intRet := mixerGetLineControls(hMix, @mxlc, MIXER_GETLINECONTROLSF_ONEBYTYPE);
          if intRet = MMSYSERR_NOERROR then begin
            FillChar(mxcd, SizeOf(mxcd),0);
            mxcd.dwControlID := mxc.dwControlID;
            mxcd.cbStruct := SizeOf(mxcd);
            mxcd.cMultipleItems := 0;
            mxcd.cbDetails := SizeOf(Vol);
            mxcd.paDetails := @vol;
            mxcd.cChannels := 1;
            intRet := mixerGetControlDetails(hMix, @mxcd,MIXER_SETCONTROLDETAILSF_VALUE);
            Result := vol.dwValue ;
            if intRet <> MMSYSERR_NOERROR then
              ShowMessage('GetControlDetails Error');
          end else
            ShowMessage('GetLineInfo Error');
        end;
        mixerClose(hMix);
      end;
    end;