怎样在DELPHI中控制系统的主音量,和设置静音,我看到很多帖子都是用Waveoutsetvolume(deviceid,vol)函数,对于播放一般的文件,
勉强是可以了,但是对播放CD时音量控制就无效了,怎么办?

解决方案 »

  1.   

    怎样在DELPHI中控制系统的主音量,和设置静音,我看到很多帖子都是用Waveoutsetvolume(deviceid,vol)函数,对于播放一般的文件,
    勉强是可以了,但是对播放CD时音量控制就无效了,怎么办?
      

  2.   

    unit Volume; interface uses windows,mmsystem; type
        Tvolume=record
           left,right:word; // 取值范围 0--65535
        end; procedure fillstruct(control:PMixerControl;var Cdetails:tMIXERCONTROLDETAILS); 
    function getpeak(control:PMixerControl;var peak:integer):boolean; 
    function setvolume(control:Pmixercontrol; volume:Tvolume):boolean; 
    function getvolume(control:Pmixercontrol; volume:Tvolume):boolean; var
        mcontrols:array of array of array of PMixerControl; //mixer的数组,单声卡可以不用
        fmixerhandle:HMIXER; //mixer的句柄 implementation procedure fillstruct(control:PMixerControl;var Cdetails:tMIXERCONTROLDETAILS); 
    begin
        Cdetails.cbStruct:=sizeof(cdetails);
        cdetails.dwControlID:=Control.dwControlID;
        cdetails.cbDetails:=sizeof(integer);
        cdetails.hwndOwner:=0; 
    end; function getpeak(control:PMixerControl;var peak:integer):boolean; 
    var
       details:TMixerControlDetailsSigned;
       cdetails:tMIXERCONTROLDETAILS; 
    begin
        Result:=false;
        if control.dwControlType<> mixercontrol_controltype_peakmeter then exit;
        cdetails.cChannels:=1;
        cdetails.paDetails:=@details;
        fillstruct(control,cdetails);
        result:=mixerGetControlDetails(fmixerhandle,@cdetails,MIXER_GETCONTROLDETAILSF_VALUE)=0; 
    end; function setvolume(control:Pmixercontrol; volume:Tvolume):boolean; 
    var
        details:array[0..30] of integer;
        cdetails:tMIXERCONTROLDETAILS; 
    begin
        fillstruct(control,cdetails);
        cdetails.cChannels:=2;
        cdetails.paDetails:=@details;
        details[0]:=volume.left;
        details[1]:=volume.right;
        result:=mixerSetControlDetails(fmixerhandle,@cdetails,MIXER_GETCONTROLDETAILSF_VALUE)=0;
        volume.left:=details[0];
        volume.right:=details[1]; 
    end; function getvolume(control:Pmixercontrol; volume:Tvolume):boolean; 
    var
        details:array[0..30] of integer;
        cdetails:tMIXERCONTROLDETAILS; 
    begin
        fillstruct(control,cdetails);
        cdetails.cChannels:=2;
        cdetails.paDetails:=@details;
        result:=mixerGetControlDetails(fmixerhandle,@cdetails,MIXER_GETCONTROLDETAILSF_VALUE)=0;
        volume.left:=details[0];
        volume.right:=details[1]; 
    end; end. // 调用方法: 
    procedure TForm1.Button1Click(Sender: TObject); 
    var s : Tvolume;
         kz : Pmixercontrol; 
    begin
        new(kz); //<------------ 此处一定要分配内存 
    kz.dwControlID := 0; 
    s.left := 0; 
    s.right := 0; 
    try 
    setvolume(kz,s); 
    except 
    end; 
    freemem(kz); 
    end;