我正在尝试制作一个在TEdit中的每个按键上播放声音文件的程序。
我在Edit1 KeyPress事件上的资源文件中尝试过sndPlaySound,但问题是它并没有像在真正的键盘输入中那样完全播放声音。按下每个按键之间的声音播放会有延迟。
procedure TForm2.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
sndPlaySound(PCHAR('KeyPress'), SND_RESOURCE OR SND_ASYNC);
end;
此代码可播放声音,但如果您快速输入,只需在您键入的最后一个键上,您就会听到正在播放的声音文件。
答案 0 :(得分:3)
您可以使用WAVEOUT接口,但我相信此延迟是必须更正的代码中的一些细节。尝试使用参数SND_FILENAME。
api适合你要做的事情。
答案 1 :(得分:1)
TLama发布的答案是这段代码非常有效:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Bass;
type
TForm1 = class(TForm)
Edit1: TEdit;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
private
StreamHandle: HSTREAM;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
if BASS_Init(-1, 44100, 0, Handle, nil) then
begin
StreamHandle := BASS_StreamCreateFile(False, PChar('c:\Windows\Media\tada.wav'), 0,
0, 0 {$IFDEF UNICODE} or BASS_UNICODE {$ENDIF});
end;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
BASS_StreamFree(StreamHandle);
BASS_Free;
end;
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
BASS_ChannelPlay(StreamHandle, True);
end;
end.