【问题标题】:How to make installer with a background window image slideshow and infinite music loop playback?如何制作带有背景窗口图像幻灯片和无限音乐循环播放的安装程序?
【发布时间】:2016-09-22 18:40:16
【问题描述】:

我想在我的安装程序中有:

  • 安装过程中无限循环播放音乐

  • 背景上的一个窗口(就像旧的安装,用于用图像填充屏幕并仅显示安装窗口),在该背景窗口上带有幻灯片

如何在 InnoSetup 中做到这一点?

【问题讨论】:

  • -1 您必须学习语法,这很难阅读。在佛罗里达州,您很有可能以英语为母语,因此我不会编辑您的帖子以纠正缺少标点符号和其他内容。
  • 您可以使用例如Inno Media Player。这是an example of how to play sound</selfpromotion> :-) 这里是 how to make a slideshow 最后要在背景上显示旧样式窗口,请使用 WindowVisible 指令。
  • @TLama 我第一次读过那个,但它是针对应用程序而不是安装的,我什至无法弄清楚它到底发生了什么来理解它,所以我认为它拥有所有其他的我不需要的东西,但仍然不知道如何让它循环播放音乐
  • 参见that example 并阅读OnMediaPlayerEvent 回调方法中的注释。只不过是在该事件方法中使用相同的音频播放初始化代码...... ;-)
  • 好吧,我可以肯定地说,我不断收到该代码的错误,甚至包括这些未知类型“WideString”的示例代码都将其全部删除,然后将这个未知类型“HRESULT”删除然后是这个未知的标识符“DSInitializeAudeoFile”,我发现还有更多错误

标签: inno-setup


【解决方案1】:

如果您想让安装程序带有背景图像幻灯片和无限音乐曲目播放,您可以执行例如以下:

  • 获取最新版本的 InnoCallback 库以实现幻灯片计时器
  • 对于音乐播放获取例如用于 Unicode Inno 设置的 Inno Media Player 的最新副本

编写类似于以下脚本或download the complete project 的脚本,其中包括下一个脚本代码中使用的所有必要文件。因此,您唯一需要做的就是在最新版本的 Unicode Inno Setup 中构建它。

请注意,Inno Media Player 是一个 Unicode 库,因此您只能将它与 Inno Setup 的 Unicode 版本一起使用,而不能与 ANSI 版本一起使用!不支持 ANSI 版本的 Inno Setup...!

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
OutputDir=userdocs:Inno Setup Examples Output
BackColor=clLime
BackColor2=clYellow
WindowVisible=yes

[Files]
Source: "Image1.bmp"; Flags: dontcopy
Source: "Image2.bmp"; Flags: dontcopy
Source: "AudioFile.mp3"; Flags: dontcopy
Source: "MediaPlayer.dll"; Flags: dontcopy
Source: "InnoCallback.dll"; Flags: dontcopy

[Code]
var
  TimerID: Integer;
  SlideID: Integer;
  BackImage: TBitmapImage;
const
  EC_COMPLETE = $01;
type
  TTimerProc = procedure(Wnd: HWND; Msg: UINT; TimerID: UINT_PTR; 
    SysTime: DWORD);
  TDirectShowEventProc = procedure(EventCode, Param1, Param2: Integer);

function WrapTimerProc(Callback: TTimerProc; ParamCount: Integer): LongWord;
  external 'wrapcallback@files:InnoCallback.dll stdcall';    
function SetTimer(hWnd: HWND; nIDEvent, uElapse: UINT;
  lpTimerFunc: UINT): UINT; external 'SetTimer@user32.dll stdcall';
function KillTimer(hWnd: HWND; uIDEvent: UINT): BOOL; 
  external 'KillTimer@user32.dll stdcall'; 

function DSGetLastError(var ErrorText: WideString): HRESULT;
  external 'DSGetLastError@files:mediaplayer.dll stdcall';
function DSPlayMediaFile: Boolean;
  external 'DSPlayMediaFile@files:mediaplayer.dll stdcall';
function DSStopMediaPlay: Boolean;
  external 'DSStopMediaPlay@files:mediaplayer.dll stdcall';
function DSSetVolume(Value: LongInt): Boolean;
  external 'DSSetVolume@files:mediaplayer.dll stdcall';
function DSInitializeAudioFile(FileName: WideString; 
  CallbackProc: TDirectShowEventProc): Boolean; 
  external 'DSInitializeAudioFile@files:mediaplayer.dll stdcall';

procedure OnMediaPlayerEvent(EventCode, Param1, Param2: Integer); 
begin
  if EventCode = EC_COMPLETE then
  begin
    if DSInitializeAudioFile(ExpandConstant('{tmp}\AudioFile.mp3'), 
      @OnMediaPlayerEvent) then
    begin
      DSSetVolume(-2500);
      DSPlayMediaFile;
    end;
  end;
end;

procedure OnSlideTimer(Wnd: HWND; Msg: UINT; TimerID: UINT_PTR; 
  SysTime: DWORD);
begin
  case SlideID of 
    0: SlideID := 1;
    1: SlideID := 0;
  end;
  BackImage.Bitmap.LoadFromFile(
    ExpandConstant('{tmp}\Image' + IntToStr(SlideID + 1) + '.bmp'));
end;

procedure StartSlideTimer;
var
  TimerCallback: LongWord;
begin
  TimerCallback := WrapTimerProc(@OnSlideTimer, 4);
  { third parameter here is the timer's timeout value in milliseconds }
  TimerID := SetTimer(0, 0, 5000, TimerCallback);
end;

procedure KillSlideTimer;
begin
  if TimerID <> 0 then 
  begin
    if KillTimer(0, TimerID) then
      TimerID := 0;
  end;
end;

procedure InitializeWizard;
var
  ErrorCode: HRESULT;
  ErrorText: WideString;   
begin
  TimerID := 0;
  SlideID := 0;
  ExtractTemporaryFile('Image1.bmp');
  ExtractTemporaryFile('Image2.bmp');
  BackImage := TBitmapImage.Create(MainForm);
  BackImage.Parent := MainForm;
  BackImage.Top := 70;
  BackImage.Left := 10;  
  BackImage.AutoSize := True;
  BackImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image1.bmp'));
  StartSlideTimer;

  ExtractTemporaryFile('AudioFile.mp3');
  if DSInitializeAudioFile(ExpandConstant('{tmp}\AudioFile.mp3'), 
    @OnMediaPlayerEvent) then
  begin
    DSSetVolume(-2500);
    DSPlayMediaFile;
  end
  else
  begin
    ErrorCode := DSGetLastError(ErrorText);
    MsgBox('TDirectShowPlayer error: ' + IntToStr(ErrorCode) + '; ' + 
      ErrorText, mbError, MB_OK);
  end;
end;

procedure DeinitializeSetup;
begin
  KillSlideTimer;
  DSStopMediaPlay;
end;

更多资源:

【讨论】:

  • 可以说,声音播放初始化需要很长时间,但请注意不是库本身的问题,而是第一次DirectShow过滤器图初始化的问题。
【解决方案2】:

创建背景功能:

您尝试过图形安装程序 (http://www.graphical-installer.com) 吗?

这是一个专业的 Inno Setup 扩展,专门为此(创建具有背景的酷炫安装程序),因此创建这样的安装程序只需几分钟(无需编码)。

【讨论】:

    猜你喜欢
    • 2020-07-06
    • 1970-01-01
    • 2016-04-03
    • 2017-12-26
    • 1970-01-01
    • 1970-01-01
    • 2022-11-08
    相关资源
    最近更新 更多