我用一个mediaplayer控件来实现播放wav文件
请教怎么实现用复选框实现静音?
用普通的set all sound all off好像不可以
在线等待
要求复选框选中则静音,但声音继续播放,只是听不到
取消复选框选中则声音恢复播放

解决方案 »

  1.   

    先制作声音拖动程序,再控制声音的Trackbar的position为0.
      

  2.   

    我也有这个问题,请教:如何制作声音拖动程序?用什么函数或API?希望有代码,谢谢!
      

  3.   

    我做了一个静音与音量控制的单元,你直接拷过去就能用。
    参数说明:
       DN:设备名称,可以是:Master主音量、Microphone麦克风、WaveOut波形、Synth为MIDI
    例:
       将主音量静音:SetVolumeMute(Master,True)unit funVolume;interfaceuses MMSystem, Dialogs;Type TDeviceName = (Master, Microphone, WaveOut, Synth);function  GetVolumeMute(DN:TDeviceName) : Boolean;
    procedure  SetVolumeMute(DN:TDeviceName; Value:Boolean);implementation//获取静音
    function  GetVolumeMute(DN:TDeviceName) : Boolean;
    var
     hMix: HMIXER;
     mxlc: MIXERLINECONTROLS;
     mxcd: TMIXERCONTROLDETAILS;
     vol: TMIXERCONTROLDETAILS_UNSIGNED;
     mxc: MIXERCONTROL;
     mxl: TMixerLine;
     intRet: Integer;
     nMixerDevs: Integer;
     mcdMute: MIXERCONTROLDETAILS_BOOLEAN;
    begin
     // Check if Mixer is available
     nMixerDevs := mixerGetNumDevs();
     if (nMixerDevs < 1) then
     begin
       Exit;
     end; // 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);   // mixerline 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_MUTE;
         mxlc.cControls := 1;
         mxlc.cbmxctrl := SizeOf(mxc);
         mxlc.pamxctrl := @mxc;     // Get the mute control
         intRet := mixerGetLineControls(hMix, @mxlc, MIXER_GETLINECONTROLSF_ONEBYTYPE);     if intRet = MMSYSERR_NOERROR then
         begin
           FillChar(mxcd, SizeOf(mxcd),0);
           mxcd.cbStruct := SizeOf(TMIXERCONTROLDETAILS);
           mxcd.dwControlID := mxc.dwControlID;
           mxcd.cChannels := 1;
           mxcd.cbDetails := SizeOf(MIXERCONTROLDETAILS_BOOLEAN);
           mxcd.paDetails := @mcdMute;       // Get  mute
           intRet := mixerGetControlDetails(hMix, @mxcd, MIXER_SETCONTROLDETAILSF_VALUE);       if mcdMute.fValue = 0 then Result:=false
           else Result := True;       if intRet <> MMSYSERR_NOERROR then
             ShowMessage('SetControlDetails Error');
         end
         else
           ShowMessage('GetLineInfo Error');
       end;   intRet := mixerClose(hMix);
     end;
    end;//设置静音
    procedure  SetVolumeMute(DN:TDeviceName; Value:Boolean);
    var
     hMix: HMIXER;
     mxlc: MIXERLINECONTROLS;
     mxcd: TMIXERCONTROLDETAILS;
     vol: TMIXERCONTROLDETAILS_UNSIGNED;
     mxc: MIXERCONTROL;
     mxl: TMixerLine;
     intRet: Integer;
     nMixerDevs: Integer;
     mcdMute: MIXERCONTROLDETAILS_BOOLEAN;
    begin
     // Check if Mixer is available
     nMixerDevs := mixerGetNumDevs();
     if (nMixerDevs < 1) then
     begin
       Exit;
     end; // 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);   // mixerline 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_MUTE;
         mxlc.cControls := 1;
         mxlc.cbmxctrl := SizeOf(mxc);
         mxlc.pamxctrl := @mxc;     // Get the mute control
         intRet := mixerGetLineControls(hMix, @mxlc, MIXER_GETLINECONTROLSF_ONEBYTYPE);     if intRet = MMSYSERR_NOERROR then
         begin
           FillChar(mxcd, SizeOf(mxcd),0);
           mxcd.cbStruct := SizeOf(TMIXERCONTROLDETAILS);
           mxcd.dwControlID := mxc.dwControlID;
           mxcd.cChannels := 1;
           mxcd.cbDetails := SizeOf(MIXERCONTROLDETAILS_BOOLEAN);
           mxcd.paDetails := @mcdMute;       // Set and UnSet  mute
           mcdMute.fValue := Ord(Value);
           intRet := mixerSetControlDetails(hMix, @mxcd, MIXER_SETCONTROLDETAILSF_VALUE);       if intRet <> MMSYSERR_NOERROR then
             ShowMessage('SetControlDetails Error');
         end
         else
           ShowMessage('GetLineInfo Error');
       end;   intRet := mixerClose(hMix);
     end;
    end;end.