请问如何在Delphi中编程控制WINDOW的主音量(Master Volume)?(100分)

  • 主题发起人 主题发起人 yangquan
  • 开始时间 开始时间
Y

yangquan

Unregistered / Unconfirmed
GUEST, unregistred user!
如何在Delphi中编程控制WINDOW的主音量(Master Volume)?如静音(Mute),音量增减。
 
http://www.bhnet.com.br/~simonet/archive/mmvol.zip
有个例程,很简单几行代码可以控制所有的音量。
 
api中有关于音量控制的函数
 
我想控制主音量,不只是wave,midi,cdaudio等设备。
 
用API函数waveOutSetVolume
 
請記得我:
E-Mail:jacksee@cmmail.com
 
用waveOutSetVolume
MMRESULT waveOutSetVolume(
HWAVEOUT hwo,
DWORD dwVolume
);

Parameters
hwo
Handle of an open waveform-audio output device. This parameter can also be a device identifier.
dwVolume
New volume setting. The low-order word contains the left-channel volume setting, and the high-order word contains the right-channel setting. A value of 0xFFFF represents full volume, and a value of 0x0000 is silence.
If a devicedo
es not support both left and right volume control, the low-order word of dwVolume specifies the volume level, and the high-order word is ignored.
 
1.uses mmsystem;
2.windows API:WaveOutSetVolume
两个参数:波形设备句柄(用TMediaPlayer.DeviceID表示比较简单)
设置音量的DWORD值
3.更多参考可见Delphi光盘里的Win32.hlp
 
补充一点:WaveOutSetVolume只限于控制波形文件,对于MIDI等设备的控制有其他相应
的API函数
 
对于静音功能,可再用函数时将音量值输入最小.
如果只是想实现静音的话,可直接调用MCISendString函数,命令如下:
Set (设备名或自定义的设备别名) audio all off
left off(左声道静音)
Right off(右声道静音)
设备别名的定义方法也使用MCISendString
Open (声音文件的路径及名称) alias (别名)
关于MCISendString的其他参数设置请参照Win32.hlp;
 
>>caofx
用你的方法能控制realplay的左、右声道吗
 
我没试过
今天早上我还在想如果RealPlayer能控制左右声道的话,用它看钢片就不用那么吃力地
听粤语看字母了。
 
多谢各位的建议,我知道用MCI易控制播放WAV、DAT等的音量,但不知道如何控制
WINDOWS系统的总的输出音量(即Master Volume),我的目的是编成Authorware的
函数,在Authorware中调用。(编制Authorware函数的方法我已知道)
 
试一下API中的AuxSetVolume
 
yangquan:如果你还要继续讨论请定期提前你的帖子,如果不想继续讨论请结束帖子。
 
我想控制的是windows的总的输出音量,即任务栏右边小喇叭图标所控制的音量,
用mciSendCommand函数实现不了,查资料知用Mixer(混音器)可实现,但我刚接触
Delphi,看不懂,请高手指教。
 
{ Ido
n't know much ,but I copy a paragraph to you,
hoping to be a little helpful...
Both right and left vulume can be controlled.}
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls,
Forms, Dialogs,mmSystem, ComCtrls, StdCtrls, Buttons;/////
//////////////////mmSystem!!!!

type
TForm1 = class(TForm)
TrackBar1: TTrackBar;
Label1: TLabel;
TrackBar2: TTrackBar;
Label2: TLabel;
Label3: TLabel;
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

//Set TraackBar1.max:=255;
t:=TrackBar1.Position;
//v's high 16 bits:right Blast;
v's low 16 bits:left blast
v:=(t shl 8)or(t shl 24);
if WaveOutSetVolume(0,v)<>MMSYSERR_NOERROR then

ShowMessage('Fail!');
end;


procedure TForm1.TrackBar2Change(Sender: TObject);
var t,v:longint;
begin

t:=TrackBar2.Position;
WaveOutGetVolume(0,@v);;//Change left blast while keep right
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);//Change right blast while keep left
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 shl 16);
//only use high 8 bits,you can get more obvious effect
// For WaveFormFile,you can use WaveOutGetVolume
// For cd File,you can use auxgetvulume;
TrackBar1.Position:=(TrackBar2.Position+TrackBar3.Position)div 2;
end;


end.

 
多人接受答案了。
 
后退
顶部