【问题标题】:sndPlaySound or PlaySound on KeyPress - Playing keyboard soundsKeyPress 上的 sndPlaySound 或 PlaySound - 播放键盘声音
【发布时间】:2013-07-15 20:42:52
【问题描述】:

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

我在 Edit1 KeyPress 事件的资源文件中尝试了 sndPlaySound,但问题是它无法像在真正的键盘输入中那样完全播放声音。每次按下按键之间都会出现声音播放延迟。

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

此代码确实会播放声音,但如果您快速键入,则只有在您键入的最后一个键时,您才会听到正在播放的声音文件。

【问题讨论】:

  • 我认为您永远不会使用 Windows API 来实现这一点。我建议您使用一些专门的音频库,例如 Bass 音频库。
  • 您能否提供一个工作示例,说明如何使用 Bass 来实现我在问题中描述的内容?
  • 嗯,这就是你可以尝试自己做的事情。 StackOverflow 不是“请为我编写代码” 服务。但是,既然这很容易,我会破例;试试代码like this。只是不要忘记下载library itself,然后从该存档中使Bass.pas 单元在项目的搜索路径中可见,Bass.dll 在项目的输出中可见。请注意,它不是 Delphi 中唯一可用的音频库,我不想支持它。这只是我头顶上的第一个......
  • 正是我要找的……非常感谢
  • 不客气!无论如何,请随时将该代码包含在您的下面的帖子中和accept it

标签: delphi playsound


【解决方案1】:

您可以使用 WAVEOUT 接口,但我相信这种延迟是代码中必须纠正的一些细节。尝试使用参数 SND_FILENAME。

该 api 适合您正在尝试做的事情。

【讨论】:

    【解决方案2】:

    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.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 2015-07-09
      • 1970-01-01
      • 2012-02-06
      相关资源
      最近更新 更多