如何在 Inno Setup 中制作停止和暂停/恢复/播放音乐按钮

2024-01-12

我想在所有页面的左下角创建两个彼此相邻的按钮,例如重新加载。

第一个按钮显示PauseResume命令(如果我单击Pause,按钮将切换到Resume自动地)。

另一个按钮显示Stop命令(如果我单击Stop,下一个按钮将切换到从头开始播放自动地)

这段代码只是添加Pause/恢复/从头开始播放*按钮和Stop button

问题是:如果我按Stop按钮,音乐永久停止并且播放形式开始按钮永远不会出现。

    [Setup]
AppName=Bass Audio Project
AppVersion=1.0
DefaultDirName={pf}\Bass Audio Project

[Files]
Source: Bass.dll; Flags: dontcopy
Source: AudioFile.mp3; Flags: dontcopy


[Code]
const
  BASS_SAMPLE_LOOP = 4;
  BASS_ACTIVE_STOPPED = 0;
  BASS_ACTIVE_PLAYING = 1;
  BASS_ACTIVE_STALLED = 2;
  BASS_ACTIVE_PAUSED  = 3;
  BASS_UNICODE = $80000000;
  BASS_CONFIG_GVOL_STREAM = 5;
const
  #ifndef UNICODE
    EncodingFlag = 0;
  #else
    EncodingFlag = BASS_UNICODE;
  #endif
type
  HSTREAM = DWORD;

function BASS_Init(device: LongInt; freq, flags: DWORD;
  win: HWND; clsid: Cardinal): BOOL;
  external 'BASS_Init@files:bass.dll stdcall';
function BASS_StreamCreateFile(mem: BOOL; f: string; offset1: DWORD;
  offset2: DWORD; length1: DWORD; length2: DWORD; flags: DWORD): HSTREAM;
  external 'BASS_StreamCreateFile@files:bass.dll stdcall';
function BASS_Start: BOOL;
  external 'BASS_Start@files:bass.dll stdcall';
function BASS_Pause: BOOL;
  external 'BASS_Pause@files:bass.dll stdcall';
function BASS_Stop(): Boolean;
  external 'BASS_Stop@files:BASS.dll stdcall delayload';
function BASS_ChannelPlay(handle: DWORD; restart: BOOL): BOOL;
  external 'BASS_ChannelPlay@files:bass.dll stdcall';
function BASS_SetConfig(option: DWORD; value: DWORD ): BOOL;
  external 'BASS_SetConfig@files:bass.dll stdcall';
function BASS_ChannelIsActive(handle: DWORD): DWORD;
  external 'BASS_ChannelIsActive@files:bass.dll stdcall';
function BASS_Free: BOOL;
  external 'BASS_Free@files:bass.dll stdcall';

var
  SoundStream: HSTREAM;
  PauseResumePlayButton: TNewButton;
  StopButton: TNewButton;

procedure ResumeButtonClick(Sender: TObject); forward;

procedure PauseButtonClick(Sender: TObject);
begin
  if BASS_Pause then
  begin
    PauseResumePlayButton.Caption := 'Resume';
    PauseResumePlayButton.OnClick := @ResumeButtonClick;
  end;
end;

procedure ResumeButtonClick(Sender: TObject);
begin
  if BASS_start then
  begin
    PauseResumePlayButton.Caption := 'Pause';
    PauseResumePlayButton.OnClick := @PauseButtonClick;
  end;
end;

procedure PlayButtonClick(Sender: TObject);
begin
  if BASS_Start then
  begin
    PauseResumePlayButton.Caption := 'Pause';
    PauseResumePlayButton.OnClick := @PauseButtonClick;
  end;
end;


procedure StopButtonClick(Sender: TObject);
begin
  if BASS_Stop then
  begin
    PauseResumePlayButton.Caption := 'Play';
    PauseResumePlayButton.OnClick := @PlayButtonClick;
  end;
       begin
       BASS_Free;
       end;
end;

procedure InitializeWizard();
begin
  ExtractTemporaryFile('AudioFile.mp3');
  if BASS_Init(-1, 44100, 0, 0, 0) then
  begin
    SoundStream :=
      BASS_StreamCreateFile(
        False, ExpandConstant('{tmp}\AudioFile.mp3'), 0, 0, 0, 0,
        EncodingFlag or BASS_SAMPLE_LOOP);
    BASS_SetConfig(BASS_CONFIG_GVOL_STREAM, 2500);
    BASS_ChannelPlay(SoundStream, False);

    StopButton := TNewButton.Create(WizardForm);
    StopButton.Parent := WizardForm;
    StopButton.Left :=
      WizardForm.ClientWidth -
      WizardForm.CancelButton.Left - WizardForm.CancelButton.Width;
    StopButton.Top := WizardForm.CancelButton.Top;
    StopButton.Width :=  WizardForm.CancelButton.Width;
    StopButton.Height := WizardForm.CancelButton.Height;
    StopButton.Caption := 'Stop';
    StopButton.OnClick := @StopButtonClick;

    PauseResumePlayButton := TNewButton.Create(WizardForm);
    PauseResumePlayButton.Parent := WizardForm;
    PauseResumePlayButton.Left :=
      WizardForm.ClientWidth -
      WizardForm.NextButton.Left - WizardForm.NextButton.Width;
    PauseResumePlayButton.Top := WizardForm.CancelButton.Top;
    PauseResumePlayButton.Width :=  WizardForm.CancelButton.Width;
    PauseResumePlayButton.Height := WizardForm.CancelButton.Height;
    PauseResumePlayButton.Caption := 'Pause';
    PauseResumePlayButton.OnClick := @PauseButtonClick;
  end;
end;

procedure DeinitializeSetup;
begin
  BASS_Free;
end;

使用单个来实现这个并不是一个好主意OnClick处理程序。

改变OnClick根据需要动态处理程序,以获得更简单的代码:

const
  BASS_SAMPLE_LOOP = 4;
  BASS_ACTIVE_STOPPED = 0;
  BASS_ACTIVE_PLAYING = 1;
  BASS_ACTIVE_STALLED = 2;
  BASS_ACTIVE_PAUSED  = 3;
  BASS_UNICODE = $80000000;
  BASS_CONFIG_GVOL_STREAM = 5;
const
  #ifndef UNICODE
    EncodingFlag = 0;
  #else
    EncodingFlag = BASS_UNICODE;
  #endif
type
  HSTREAM = DWORD;

function BASS_Init(device: LongInt; freq, flags: DWORD;
  win: HWND; clsid: Cardinal): Boolean;
  external 'BASS_Init@files:bass.dll stdcall';
function BASS_StreamCreateFile(mem: Boolean; f: string; offset1: DWORD;
  offset2: DWORD; length1: DWORD; length2: DWORD; flags: DWORD): HSTREAM;
  external 'BASS_StreamCreateFile@files:bass.dll stdcall';
function BASS_ChannelPlay(handle: DWORD; restart: Boolean): Boolean;
  external 'BASS_ChannelPlay@files:bass.dll stdcall';
function BASS_ChannelPause(handle: DWORD): Boolean;
  external 'BASS_ChannelPause@files:bass.dll stdcall';
function BASS_SetConfig(option: DWORD; value: DWORD ): Boolean;
  external 'BASS_SetConfig@files:bass.dll stdcall';
function BASS_ChannelIsActive(handle: DWORD): DWORD;
  external 'BASS_ChannelIsActive@files:bass.dll stdcall';

var
  SoundStream: HSTREAM;
  PauseResumePlayButton: TNewButton;
  StopButton: TNewButton;

procedure ResumeButtonClick(Sender: TObject); forward;

procedure PauseButtonClick(Sender: TObject);
begin
  if BASS_ChannelPause(SoundStream) then
  begin
    PauseResumePlayButton.Caption := 'Resume';
    PauseResumePlayButton.OnClick := @ResumeButtonClick;
  end;
end;  

procedure ResumeButtonClick(Sender: TObject);
begin
  if BASS_ChannelPlay(SoundStream, False) then
  begin
    PauseResumePlayButton.Caption := 'Pause';
    PauseResumePlayButton.OnClick := @PauseButtonClick;
  end;
end;  

procedure PlayButtonClick(Sender: TObject);
begin
  if BASS_ChannelPlay(SoundStream, True) then
  begin
    PauseResumePlayButton.Caption := 'Pause';
    PauseResumePlayButton.OnClick := @PauseButtonClick;
  end;
end;  

procedure StopButtonClick(Sender: TObject);
begin
  if (BASS_ChannelIsActive(SoundStream) = BASS_ACTIVE_PAUSED) or
     BASS_ChannelPause(SoundStream) then
  begin
    PauseResumePlayButton.Caption := 'Play';
    PauseResumePlayButton.OnClick := @PlayButtonClick;
  end;
end;  

procedure InitializeWizard();
begin
  if BASS_Init(-1, 44100, 0, 0, 0) then
  begin
    ExtractTemporaryFile('AudioFile.mp3');
    SoundStream :=
      BASS_StreamCreateFile(
        False, ExpandConstant('{tmp}\AudioFile.mp3'), 0, 0, 0, 0,
        EncodingFlag or BASS_SAMPLE_LOOP);

    if SoundStream <> 0 then
    begin
      BASS_SetConfig(BASS_CONFIG_GVOL_STREAM, 2500);

      if BASS_ChannelPlay(SoundStream, False) then
      begin
        StopButton := TNewButton.Create(WizardForm);
        StopButton.Parent := WizardForm;
        StopButton.Left :=
          WizardForm.ClientWidth -
          WizardForm.CancelButton.Left -  WizardForm.CancelButton.Width;
        StopButton.Top := WizardForm.CancelButton.Top;
        StopButton.Width :=  WizardForm.CancelButton.Width;
        StopButton.Height := WizardForm.CancelButton.Height;
        StopButton.Caption := 'Stop';
        StopButton.OnClick := @StopButtonClick;

        PauseResumePlayButton := TNewButton.Create(WizardForm);
        PauseResumePlayButton.Parent := WizardForm;
        PauseResumePlayButton.Left :=
          WizardForm.ClientWidth -
          WizardForm.NextButton.Left -  WizardForm.NextButton.Width;
        PauseResumePlayButton.Top := WizardForm.CancelButton.Top;
        PauseResumePlayButton.Width :=  WizardForm.CancelButton.Width;
        PauseResumePlayButton.Height := WizardForm.CancelButton.Height;
        PauseResumePlayButton.Caption := 'Pause';
        PauseResumePlayButton.OnClick := @PauseButtonClick;
      end;
    end;
  end;
end;
  • 请注意,您调用了BASS_StreamCreateFile, BASS_SetConfig and BASS_ChannelPlay两次具有相同的参数。它没有任何意义。我已经删除了第二组。
  • 我还调整了按钮的位置。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Inno Setup 中制作停止和暂停/恢复/播放音乐按钮 的相关文章

  • TinyMCE 的 addButton() 函数中所有可能的设置属性是什么?

    The 文档 http www tinymce com wiki php API3 method tinymce Editor addButton对此还不是很清楚 name 字符串 要添加的按钮名称 设置 对象 带有标题 cmd 的设置对象
  • 在 Inno Setup 中使用 {AppVersion} 作为函数的参数

    所以我有一个正在更新一些 XML 的函数 我想传递 AppVersion 已设置在 Setup 脚本的一部分作为该函数的常量 我努力了 MyFunction ExpandConstants AppVersion 但这给了我一个错误 如何正确
  • Visual Studio 中列表框的上移、下移按钮[重复]

    这个问题在这里已经有答案了 我正在尝试制作一个上移按钮和一个下移按钮 以移动 Microsoft Visual Studio 2012 中列表框中的选定项目 我已经在 WDF jquery winforms 和其他一些表单中看到了其他示例
  • Inno Setup:使用缩进保存 XML 文档

    我正在尝试在 Inno Setup 中向 XML 文件添加一个新节点 节点添加正确 但下一个标记之前的换行符被删除或未添加换行符 这是我的添加节点代码 NewNode XMLDoc createElement Test XMLDoc set
  • 如何禁用 Yii2 中的按钮

    我正在尝试禁用创建项目 Button当用户未登录时 该按钮将Hide or disable 这是我的条件 p p 它正在工作 但是 当用户登
  • Inno Setup:当我在命令行中静默执行安装程序时,如何为安装程序提供序列号?

    正如标题中所述 我想知道当我在命令行中静默执行安装程序时 如何为安装程序提供序列号 iss Setup DefaultUserInfoSerial param serialnumber Default serial 命令行 setup ex
  • 按下按钮时有多个命令

    我想在单击按钮时运行多个功能 例如我希望我的按钮看起来像 self testButton Button self text test command func1 command func2 当我执行此语句时 我收到错误 因为我无法将某些内容
  • 使用 Inno Setup 中格式化(部分粗体)的文本制作安装程序?

    有人看过 GOG com 游戏安装程序吗 如何制作像这样的欢迎文本字符串 包括单个标题中的路径和需要大小 其中部分内容加粗 以下是修改安装路径后如何更改字符串换行的示例 您可以使用TRichEditViewer http www jrsof
  • 尝试获取屏幕上绘制的每个随机圆圈的 x、y 坐标

    您好 我正在制作一款游戏 该游戏将在屏幕上创建随机圆圈 随机创建的圆圈的值为红色或绿色 我的问题是 我希望不仅能够确定用户何时单击其中一个圆圈 而且还能够确定他们最终单击的圆圈 红色或绿色 下面是我的代码 我的主要问题是试图找到将要绘制的圆
  • 继续在 Matlab 中一遍又一遍地播放声音?

    我正在尝试创建一个 MATLAB 程序来每隔几分钟一遍又一遍地播放声音 现在我将其设置为每隔几秒播放一次 只是为了消除系统中的一些错误 但是 当我的程序尝试重播声音时 我收到此错误 Error using gt audioplayer au
  • 如何在 Inno Setup 中静默安装 Microsoft VC++ 可再发行组件?

    如何在 Inno Setup 中静默安装 Microsoft VC 可再发行组件 我使用了以下代码 除了安装进度窗口之外 大部分安装部分都是静默的 这是我的 Run 部分代码 Run Filename app bin vcredist x8
  • 将用户填写的表单添加到 Inno Setup

    我想添加一个小表格 由用户在程序安装时使用 Inno Setup 填写 然后需要将该表格和预定义的电子邮件地址通过电子邮件发回给我 该表格需要在几个领域中使用 例如 用户名 Address Email 电话号码等 一旦我有了一个例子 我希望
  • Inno Setup 生成的安装程序在某些系统上不显示“选择目标位置”页面

    我创建我的应用程序py2exe并使用 Windows 7 上的 Inno Setup 将其打包为安装程序 exe 这样创建的安装程序可以安装在 Windows 7 和 Windows 10 系统上 当它工作时 安装程 序会按顺序显示以下屏幕
  • 如何在占位符中动态生成的标签之间创建换行符?

    这是文件后面代码中的以下代码Page Load event LinkButton linkButton new LinkButton linkButton ID LinkButtonDynamicInPlaceHolder1Id i lin
  • 如何找到 Inno Setup 可用的任务和任务名称

    如果我想通过命令行使用其 exe 文件安装程序 那么我知道我可以使用以下命令更改默认选项 TASKS切换 但如何找出可用的任务以及它们各自的任务名称是什么 我知道我可以运行安装程序并使用 SAVEINF开关将使用的设置保存到文件中 文件的底
  • 多个提交按钮

    我在 HTML 和 PHP 中遇到多个提交按钮时遇到问题 我尝试为基于 Web 的计算器编写 GUI 代码 这确实很容易 但是 php 中的函数并不那么容易 所以我有这个简单的 GUI 有 6 个提交按钮
  • 避免 Inno Setup 中的“无法展开 shell 文件夹常量 userdocs”错误

    我将一些示例文档安装到 Windows 上标准 我的文档 文件夹的 PerfectTablePlan 子文件夹中 这对于 99 以上的用户来说效果很好 但是 如果用户没有 我的文档 文件夹 我会收到许多以下形式的丑陋错误消息 内部错误 无法
  • 如何向按钮添加动画 gif?

    你能告诉我如何在 C 中向按钮添加动画 gif 吗 仅仅通过将 gif 添加到资源并设置为按钮图像并不能很好地工作 下一个帧出现在前一个帧之上 问题似乎在于 c 如何处理透明度 但我不知道如何解决它 提前致谢 编辑 玩完 gif 后 问题出
  • Inno Setup 中的文件关联

    我正在使用 Inno Setup 并尝试关联位于Program Files x86 在 Windows 7 中 我有以下内容 define MyAppName MyView define MyAppExeName MyView exe Se
  • SwiftUI 键盘工具栏有条件

    不确定这是否是一个错误或者我是否做错了什么 但如果我使用 toolbar ToolbarItemGroup placement navigationBarLeading if isFocused zipCode Text Test 当等于

随机推荐

  • 像 '%' 不接受 NULL 值

    我有一个根据用户输入构建的查询 通过 html 表单传递 它看起来像 简单的例子 Select From table Where table column like
  • 检测语言和 django locale-url

    我想部署一个英语和西班牙语网站并检测用户浏览器语言并重定向到正确的区域设置网站 我的网站是www elmalabarista com 我安装django localeurl https bitbucket org carljm django
  • .htaccess 文件很长可以吗?

    我在网站上向人们提供 URL 这些 URL 实际上指向一些丑陋的东西 在同一个网站上 http www mydomain com cool URL http www mydomain com cool URL实际上指向 我计划通过在需要时修
  • 为什么 iOS11 中 UIScreen.bounds 不正确

    请不要标记为重复 可用线程尚未提供答案 行为仅限 iOS11 将项目从 Xcode 8 更新到 Xcode 9 现在使用 iOS11 但仍然使用 Swift 3 我有以下经验 print UIScreen main bounds width
  • 在 PHP 5.4 中工作的 PHP 5.3 中出现错误 [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 这是在 P
  • 如何处理绑定到自定义程序集对象数据源的 RDLC 报告中的空嵌套对象?

    我有一个 RDLC 报告 我将其直接以 PDF 形式呈现到响应流 而不是使用 ReportViewer 在呈现报表的代码中 它的 DataSource 绑定到自定义程序集中定义的 List Of ClassA 对象 这似乎在大多数情况下都有
  • 如何使用注释自动装配 RestTemplate

    当我尝试自动装配 Spring 时RestTemplate 我收到以下错误 nested exception is org springframework beans factory NoSuchBeanDefinitionExceptio
  • Facebook C# SDK ASP.Net 3.5 示例

    我被要求开发一个 Facebook 应用程序 允许当前系统的用户使用这个 Facebook 应用程序找到彼此 不幸的是 他们的要求是它必须在 ASP NET 3 5 中构建 更容易为客户分发 我是一名经验丰富的 PHP 开发人员 尽管我过去
  • Android SpeechRecognizer 音频录制错误

    我正在尝试在 Android 上使用 SpeechRecognizer 而不使用 Intent Dialog 它在大多数设备上工作正常 但某些设备返回音频录制错误 错误代码 3 并且没有此错误的详细信息 有什么解决办法或者原因吗 谢谢你 当
  • 伊伊。如何添加CSS“错误”类到表单提交的输入?

    我有 Yii 形式 有些字段是必需的 提交表单时 我需要将 CSS 类 错误 添加到文本输入中 我的代码
  • Firefox 不遵守 rel=stylesheet 链接的“disabled”属性

    我有一个网站需要加载两个主题 用户可以打开 关闭第二个主题 我目前正在通过使用来完成此任务disabled链接中的标签如下 然后我切换disabled在 JavaScript 中 这在 Safari Mac Chrome Mac Windo
  • 为什么 gprof 大大低估了程序的运行时间?

    我有这个程序需要 2 34 秒才能运行 而 gprof 说它只需要 1 18 秒 我在其他地方读过答案 表明如果程序受 I O 限制 gprof 可能会出错 但这个程序显然不是 对于我正在尝试分析的有用程序 也会发生这种情况 它并不特定于这
  • MySQL validate_password_policy 未知系统变量

    我正在使用 MySQL 5 7 25 我想通过在 MySQL 命令中执行以下操作来增加我的 MySQL 密码策略 SET GLOBAL validate password policy 2 但我总是收到错误 错误 1193 HY000 未知
  • Valums Ajax Uploader (Mutli) - 检测所有文件何时上传

    我正在使用 Valums Ajax Uploader 上传一批文件 我们最近将代码从单一上传类型更改为多重上传类型 这给我们的代码带来了问题 正如你所看到的 当onComplete事件触发后 我们重新加载页面以显示新上传的图像 但是 那on
  • Java正则表达式匹配方括号[重复]

    这个问题在这里已经有答案了 我正在尝试使用正则表达式 java ReplaceAll 执行以下操作 Input Test Test1 Test2 Test3 Output TestTest3 简而言之 我需要删除方括号内的所有内容 包括方括
  • 如何在 SQLAlchemy 中使用数学方程作为过滤器

    我正在使用 SQLAlchemy ORM 在应用程序中构建 MySQL 查询 并且完全能够向查询添加基本过滤器 如下所示 query meta Session query User filter User user id 1 这给了我基本上
  • 如何使用 Jersey 2.x 设置连接和读取超时?

    在球衣 1 中我们有一个函数设置连接超时 https jersey java net apidocs 1 1 5 jersey com sun jersey api client Client html setConnectTimeout
  • 切换选项卡时倒计时器停止

    因此 基本上 当我切换选项卡时 特定页面上的倒计时器会停止倒计时 并在您返回选项卡时恢复 无论如何 有没有办法减轻这种情况 以便它在后台计数或计入您在另一个选项卡上花费的时间 这基本上就是我对 js 的看法 document getElem
  • gganimate 中框架标题的自定义列

    我想在 gganimate 标题中使用自定义列 但无法在文档中的任何位置阅读如何操作 使用其页面中的代码的示例 library gapminder ggplot gapminder aes gdpPercap lifeExp size po
  • 如何在 Inno Setup 中制作停止和暂停/恢复/播放音乐按钮

    我想在所有页面的左下角创建两个彼此相邻的按钮 例如重新加载 第一个按钮显示Pause和Resume命令 如果我单击Pause 按钮将切换到Resume自动地 另一个按钮显示Stop命令 如果我单击Stop 下一个按钮将切换到从头开始播放自动