How to check if the system master volume is mute or unmute?

前端 未结 3 551
旧巷少年郎
旧巷少年郎 2021-01-05 13:41

I\'m using this code to mute/unmute system master volume:

const
  APPCOMMAND_VOLUME_MUTE = $80000;
  WM_APPCOMMAND = $319;

procedure TForm1.Button1Click(Sen         


        
3条回答
  •  不思量自难忘°
    2021-01-05 14:03

    Use this snipped, I've tested it and works for me.
    This will check and set master volume. (Copied from http://www.swissdelphicenter.ch/torry/showcode.php?id=1630)
    I hope this helps:

     uses
          MMSystem;
    
        function GetMasterMute(
          Mixer: hMixerObj;
          var Control: TMixerControl): MMResult;
          // Returns True on success
        var
          Line: TMixerLine;
          Controls: TMixerLineControls;
        begin
          ZeroMemory(@Line, SizeOf(Line));
          Line.cbStruct := SizeOf(Line);
          Line.dwComponentType := MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
          Result := mixerGetLineInfo(Mixer, @Line,
            MIXER_GETLINEINFOF_COMPONENTTYPE);
          if Result = MMSYSERR_NOERROR then
          begin
            ZeroMemory(@Controls, SizeOf(Controls));
            Controls.cbStruct := SizeOf(Controls);
            Controls.dwLineID := Line.dwLineID;
            Controls.cControls := 1;
            Controls.dwControlType := MIXERCONTROL_CONTROLTYPE_MUTE;
            Controls.cbmxctrl := SizeOf(Control);
            Controls.pamxctrl := @Control;
            Result := mixerGetLineControls(Mixer, @Controls,
              MIXER_GETLINECONTROLSF_ONEBYTYPE);
          end;
        end;
    
        procedure SetMasterMuteValue(
          Mixer: hMixerObj;
          Value: Boolean);
        var
          MasterMute: TMixerControl;
          Details: TMixerControlDetails;
          BoolDetails: TMixerControlDetailsBoolean;
          Code: MMResult;
        begin
          Code := GetMasterMute(0, MasterMute);
          if Code = MMSYSERR_NOERROR then
          begin
            with Details do
            begin
              cbStruct := SizeOf(Details);
              dwControlID := MasterMute.dwControlID;
              cChannels := 1;
              cMultipleItems := 0;
              cbDetails := SizeOf(BoolDetails);
              paDetails := @BoolDetails;
            end;
            LongBool(BoolDetails.fValue) := Value;
            Code := mixerSetControlDetails(0, @Details,
        MIXER_SETCONTROLDETAILSF_VALUE);
          end;
          if Code <> MMSYSERR_NOERROR then
            raise Exception.CreateFmt('SetMasterMuteValue failure, '+
              'multimedia system error #%d', [Code]);
        end;
    
        // Example:
    
        procedure TForm1.Button1Click(Sender: TObject);
        begin
          SetMasterMuteValue(0, CheckBox1.Checked); // Mixer device #0 mute on/off
        end;
    

提交回复
热议问题