如何控制WINDOWS的主音量?

解决方案 »

  1.   

    贴一段:你自已试试!
    有相应的API函数可查(声音相关)
    waveInAddBuffer               向声音输入设备发送缓冲区       
    waveInClose                   关闭声音输入设备                        
    waveInGetDevCaps                        获取声音输入设备性能                   
    waveInGetErrorText                      获取声音出错的信息文本                   
    waveInGetID                             获取声音输入设备ID                   
    waveInGetNumDevs                        返回声音输入设备数量                   
    waveInGetPosition                       获取声音设备输入位置                   
    waveInMessage                           向声音输入设备发送信息                  
    waveInOpen                              打开声音输入设备                   
    waveInPrepareHeader                     预备声音输入缓冲区                   
    waveInReset                             停止声音输入设备工作                   
    waveInStart                             停止声音输入设备工作                   
    waveInStop                              停止声音输入                   
    waveInUnprepareHeader                   清除预备的声音文件头                   
    waveOutBreakLoop                        中断声音输出循环                   
    waveOutClose                            关闭声音输出设备                   
    waveOutGetDevCaps                       获取声音输出设备性能                  
    waveOutGetErrorText                     获取声音出错文本                  
    waveOutGetID                            获取声音输出设备ID                  
    waveOutGetNumDevs                       获取声音输出设备数量                  
    waveOutGetPitch                         获取声音输出的强度                  
    waveOutGetPlaybackRate                  获取声音回放率                  
    waveOutGetPosition                      获取声音回放位置                  
    waveOutGetVolume                        获取声音音量                  
    waveOutMessage                          向声音输出设备发送消息               
    waveOutOpen                             打开声音输出设备               
    waveOutPause                            暂停声音回放                   
    waveOutPrepareHeader                    预备声音回放数据块                   
    waveOutReset                            停止声音回放                   
    waveOutRestart                          重开始声音回放                   
    waveOutSetPitch                         设置波形输出强度                   
    waveOutSetPlaybackRate                  设置回放率                   
    waveOutSetVolume                        设置输出音量             
    waveOutUnprepareHeader                  清除预备声音数据块                
    waveOutWrite                            写入声音输出设备     
    控制音量要用到waveOutSetVlume函数,此函数的声明在MMSystem.h单元中。
    此单放在Delphi目录下的Source\rtl\win中主意这儿用到两个函数waveOutSetVlume和waveOutGetVolume,不要用混,
    我第一次用它们时就给搞混了,好费事。程序如下:三个TrackBar的属性设置:Max:=255;Frequency:=16;unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      ComCtrls, mmsystem;type
      TForm1 = class(TForm)
        TrackBar1: TTrackBar;
        TrackBar2: TTrackBar;
        TrackBar3: TTrackBar;
        procedure TrackBar1Change(Sender: TObject);
        procedure TrackBar2Change(Sender: TObject);
        procedure TrackBar3Change(Sender: TObject);
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.DFM}//音量控制
    procedure TForm1.TrackBar1Change(Sender: TObject);
    var
    t,v:Longint;
    begin
    // if a=0 then Exit;
     t:=TrackBar1.Position;
     v:=(t shl 8)or(t shl 24);
     waveOutSetVolume(0,v);
    end;//左声道控制
    procedure TForm1.TrackBar2Change(Sender: TObject);
    var
    t,v:Longint;
    begin
      t:=TrackBar2.Position;
      waveOutGetVolume(0,@v);
      v:=v and $ffff0000 or (t shl 8);
      waveOutSetVolume(0,v);
    end;//右声道控制
    procedure TForm1.TrackBar3Change(Sender: TObject);
    var
    t,v:Longint;
    begin
      t:=TrackBar3.Position;
      waveOutGetVolume(0,@v);
      v:=v and $0000ffff or (t shl 24);
      waveOutSetVolume(0,v);
    end;//获得当前音量值
    procedure TForm1.FormCreate(Sender: TObject);
    var
    v:longint;
    begin
      waveOutGetVolume(0,@v);
      TrackBar2.Position:=hi(v);
      TrackBar3.Position:=hi(v shr 16);
      if hi(v)>hi(v shr 16) then
       TrackBar1.Position:=hi(v)
      else
       TrackBar1.Position:=hi(v shr 16);
    end;end.
    函数说明:waveOutSetVolume
    第一个参数是波形文件输出设备标识符;
    第二个参娄是音量大小。这是一个32位的整数,低16位表示左声道的音量,
    高16位表示右声道的音量。waveOutGetVolume
    第一个参数是波形文件输出设备标识符;
    第二个参数是一个32位整数的指针。
      

  2.   

    楼上说的都不行,要用到AMixer混音器
    留下个妹儿我发给你个控件,有源码
      

  3.   

    mixerSetControlDetails
    auxoutsetvolume 是控制CD音量的  
    waveOutSetVolume 是控制波形的  
    midiOutSetVolume 是控制FM或者是synthesizerunit 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; 
      

  4.   

    //音量控制
    procedure TForm1.TrackBar1Change(Sender: TObject);
    var
    t,v:Longint;
    begin
    // if a=0 then Exit;
    t:=TrackBar1.Position;
    v:=(t shl 8)or(t shl 24);
    waveOutSetVolume(0,v);
    end;procedure tform1.trackbar1changer (sender:tobject);//左声道
    var t,v:longint;
    begin
    t:=trackbar1.postion;
    wavoutgetvolume(0,@v);
    v:=v and $ffff0000 or (t shl 8);
    wavoutsetvolume(0,v);
    end;procedure tform1.trackbar2changer (sender:tobject);//右声道
    var t,v:longint;
    begin
    t:=trackbar2.postion;
    wavoutgetvolume(0,@v);
    v:=v and $0000ffff or (t shl 24);
    wavoutsetvolume(0,v);
    end;//获得当前音量值
    procedure TForm1.FormCreate(Sender: TObject);
    var
    v:longint;
    begin
      waveOutGetVolume(0,@v);
      TrackBar2.Position:=hi(v);
      TrackBar3.Position:=hi(v shr 16);
      if hi(v)>hi(v shr 16) then
      TrackBar1.Position:=hi(v)
      else
      TrackBar1.Position:=hi(v shr 16);
    end;end.
    函数说明:waveOutSetVolume
    第一个参数是波形文件输出设备标识符;
    第二个参娄是音量大小。这是一个32位的整数,低16位表示左声道的音量,
    高16位表示右声道的音量。waveOutGetVolume
    第一个参数是波形文件输出设备标识符;
    第二个参数是一个32位整数的指针。