KeyPress上的sndPlaySound或PlaySound - 播放键盘声音

时间:2013-07-15 20:42:53

标签: delphi playsound

我正在尝试制作一个在TEdit中的每个按键上播放声音文件的程序。

我在Edit1 KeyPress事件上的资源文件中尝试过sndPlaySound,但问题是它并没有像在真正的键盘输入中那样完全播放声音。按下每个按键之间的声音播放会有延迟。

procedure TForm2.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
sndPlaySound(PCHAR('KeyPress'), SND_RESOURCE OR SND_ASYNC);
end;

此代码可播放声音,但如果您快速输入,只需在您键入的最后一个键上,您就会听到正在播放的声音文件。

2 个答案:

答案 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.