4

我目前只能通过将波形文件放在已编译的 exe 旁边来播放背景声音。但我实际上想要一个带有波形文件的静态可执行文件。这在 Delphi XE2 中可能吗?

这是我的代码:

SndPlaySound('.\Raw.wav', SND_ASYNC or SND_LOOP);
#This will play the Raw.wav that is next to my program.
4

4 回答 4

11

您可以添加SND_MEMORY标志,并将TResourceStream.Memory指针作为第一个参数传递。

首先,使用 XE2 的Project->Resources and Images菜单项添加新资源。给它你的 .wav 文件的路径和文件名,一个资源类型RC_DATA(它不在下拉列表中,但你可以手动输入它),以及一个你可以在运行时使用的资源名称来引用它。(在我的示例中,我使用C:\Microsoft Office\Office12\MEDIA\APPLAUSE.WAV,并给它一个资源名称APPLAUSE。)

procedure TForm2.Button1Click(Sender: TObject);
var
  Res: TResourceStream;
begin
  Res := TResourceStream.Create(HInstance, 'APPLAUSE', 'RC_DATA');
  try
    Res.Position := 0;
    SndPlaySound(Res.Memory, SND_MEMORY or SND_ASYNC or SND_LOOP);
  finally
    Res.Free;
  end;
end;
于 2012-05-14T00:54:06.990 回答
6

如果您使用PlaySound()而不是sndPlaySound(),您可以利用该SND_RESOURCE标志直接从其资源播放波形声音,而无需先将其加载到内存中。

于 2012-05-14T03:34:06.127 回答
2

刚刚测试过,它适用于我的:

var
  hFind, hRes: THandle;
  Song       : PChar;
begin
  hFind := FindResource(HInstance, 'BATTERY', 'WAV');
  if (hFind <> 0) then
  begin
    hRes := LoadResource(HInstance, hFind);
    if (hRes <> 0) then
    begin
      Song := LockResource(hRes);
      if Assigned(Song) then
      begin
        SndPlaySound(Song, snd_ASync or snd_Memory);
      end;
      UnlockResource(hRes);
    end;
    FreeResource(hFind);
  end;

在此处输入图像描述

于 2012-05-14T01:23:12.320 回答
2

在资源编辑器(Delphi 10、项目、资源和图像)中导入 wav 文件时,键入“WAVE”作为资源类型,然后简单地使用

   PlaySound(resourceIndentifierName, 0, SND_RESOURCE or SND_ASYNC);

不再需要 PS 大写

于 2017-12-24T11:31:01.170 回答