查看完整版本: [-- 求助虎主 如何让播放音乐和水波纹同时出现 --]

汉化新世纪论坛 -> 安装与补丁 -> 求助虎主 如何让播放音乐和水波纹同时出现 [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

电子高手 2016-01-20 12:25

求助虎主 如何让播放音乐和水波纹同时出现




我想在安装向导自动播放音乐,安装向导图片上有水波纹效果,单独运行两段代码都可以,可是我把两端代码复制一起同时运行就提示错误,请虎版指教一下,谢谢!!

下面是我的代码

[attachment=32950]

这是错误的截图
[attachment=32951]

gnatix 2016-01-21 04:38
你说单独运行两段代码都可以,那么请把两段代码单独贴出来,我好帮你检查你合并后的代码。

电子高手 2016-01-23 13:39
谢谢虎版,我已经把单独的代码发上来。再次感谢你了!!
[attachment=32953]

gnatix 2016-01-23 16:57
  1. ; 脚本由 Inno Setup 脚本向导 生成!
    ; 有关创建 Inno Setup 脚本文件的详细资料请查阅帮助文档!

    #ifdef UNICODE
      #define A "W"
    #else
      #define A "A"
    #endif

    #define MyAppName "我的程序"
    #define MyAppVersion "1.5"
    #define MyAppPublisher "我的公司"
    #define MyAppURL "http://www.example.com/"

    [Setup]
    ; 注: AppId的值为单独标识该应用程序。
    ; 不要为其他安装程序使用相同的AppId值。
    ; (生成新的GUID,点击 工具|在IDE中生成GUID。)
    AppId={{F06FAB78-8E91-4276-A880-ED1CE6299322}
    AppName={#MyAppName}
    AppVersion={#MyAppVersion}
    ;AppVerName={#MyAppName} {#MyAppVersion}
    AppPublisher={#MyAppPublisher}
    AppPublisherURL={#MyAppURL}
    AppSupportURL={#MyAppURL}
    AppUpdatesURL={#MyAppURL}
    DefaultDirName={pf}\{#MyAppName}
    DefaultGroupName={#MyAppName}
    OutputBaseFilename=setup
    Compression=lzma
    SolidCompression=yes

    [Languages]
    Name: "chinesesimp"; MessagesFile: "compiler:Default.isl"

    [Messages]
    ClickNext=单击“下一步”继续,或单击“取消”退出安装程序。%n%n%n%n%n%n%n%n本程序由陈相宇制作%n%n请于测试完成后24小时删除,否则后果自负!%n%n欢迎绣花爱好者共同讨论%n%nqq:108709796
    BeveledLabel=陈相宇制作,请于24小时内删除!

    [Files]
    Source: "D:\Uninstall\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
    Source: "D:\Richard.mp3"; Flags: dontcopy
    Source: "D:\waterctrl.dll"; Flags: dontcopy
    Source: "D:\InnoCallback.dll"; Flags: dontcopy
    Source: "D:\WizModernImage-Is.bmp"; Flags: dontcopy

    [Run]
    Filename: "{app}\CRACK\安装.bat"; Parameters: "/x"


    ; 注意: 不要在任何共享系统文件上使用“Flags: ignoreversion”


    [Code]

    type
      TTimerProc = procedure(h:longword; msg:longword; idevent:longword; dwTime:longword);
      // 回调函数参数格式声明

    var
      bmp: TBitmap;

    Function mciSendString(lpszCommand: String; lpszReturnString: Integer;
    cchReturnLength: Integer; hwndCallback: Integer): Integer;
    external 'mciSendString{#A}@winmm.dll stdcall';

    function WrapTimerProc(callback:TTimerProc; paramcount:integer):longword;
         external 'wrapcallback@files:innocallback.dll stdcall';
    // 使用回调函数的主要入口转换函数.

    function SetTimer(hWnd: longword; nIDEvent, uElapse: longword; lpTimerFunc: longword): longword;
         external 'SetTimer@user32.dll stdcall';
    // WinAPI 函数, 时间循环函数, 这个函数需要回调函数, 否则不能实现功能

    function enablewater(ParentWnd: HWND; Left, Top: integer; Bmp: HBITMAP;
         WaterRadius, WaterHeight: integer): BOOL; external 'enablewater@files:waterctrl.dll stdcall';
    //ParentWnd     放置特效窗口的父窗口句柄。
    //Left          左位置
    //Top           上位置
    //Bmp           位图句柄。
    //WaterRadius   水纹半径,会令到水纹看起来范围更广。
    //WaterHeight   水纹高度,会令到水纹看起来更深。
    //注意,水纹插件自动根据图片来设定高度和宽度,
    //另外水纹底图必须是翻转的图片,显示的时候会翻转图片来显示。

    function waterblob(x, y: integer; radius, height: integer): BOOL; external 'waterblob@files:waterctrl.dll stdcall';
    // 在 x,y 点产生半径为radius, 高度为height 的水纹。

    function flattenwater(): BOOL; external 'flattenwater@files:waterctrl.dll stdcall';
    // 平伏所有水纹。

    function disablewater(): BOOL; external 'disablewater@files:waterctrl.dll stdcall';
    //释放水纹插件

    function setwaterparent(ParentWnd: HWND): BOOL; external 'setwaterparent@files:waterctrl.dll stdcall';
    //v2 新增,设置水纹插件的父句柄

    procedure mytimerproc(h:longword; msg:longword; idevent:longword; dwTime:longword);
    begin
      waterblob(random(162), random(289), random(5), random(200));  // 随机产生小水纹
    end;

    procedure InitializeWizard();
    var
      timercallback: longword;
      BGMusicFile, SplashFile: string;
      SplashForm: TForm;
      SplashFileName: String;
      I: Integer;
    begin

    ExtractTemporaryFile(ExtractFileName(ExpandConstant('{tmp}\Richard.mp3')));
    SplashForm := TForm.create(nil);
    with SplashForm do
      begin
      mciSendString(ExpandConstant('play {tmp}\Richard.mp3'),0,0,0);
      Close;
      Free;
      end;

      ExtractTemporaryFile('WizModernImage-Is.bmp');
      bmp := TBitmap.create;
      bmp.LoadFromFile(ExpandConstant('{tmp}\WizModernImage-Is.bmp'));
      enablewater(WizardForm.WelcomePage.Handle, 0, 0, bmp.Handle, 3, 50);

      timercallback := WrapTimerProc(@mytimerproc,4); // 转换 Inno Setup 的函数入口
      settimer(0, 0, 200, timercallback);  // 实现 Timer 的循环重复调用函数效果
    end;

    procedure CurPageChanged(CurPageID: Integer);
    begin
      if CurPageID = wpWelcome then
      begin
        setwaterparent(WizardForm.WelcomePage.Handle);
    //    waterblob(70, 198, 10, 1000);
      end else
      if CurPageID = wpFinished then
      begin
        setwaterparent(WizardForm.FinishedPage.Handle);
    //    waterblob(70, 198, 10, 1000);
      end else
        flattenwater();
    end;

    procedure DeinitializeSetup();
    begin
      disablewater();
      bmp.Free;
    end;



电子高手 2016-01-25 13:18

非常感谢虎版,你的代码运行产生这样的问题,还要麻烦虎版指点一下啊!!
[attachment=32954]

gnatix 2016-01-25 14:47
你没有完全把我的代码用上啊,最上面的是:

#ifdef UNICODE
  #define A "W"
#else
  #define A "A"
#endif

电子高手 2016-01-25 17:10


那串代码用上了,不知什么原因
[attachment=32955]

gnatix 2016-01-26 01:45
你复制代码时有问题,空格被复制成特殊字符了(就是显示为 ??的地方 )。建议复制代码时用 Ctrl+C,不要点击“复制代码”这个按钮。

电子高手 2016-01-26 12:14
gnatix:你复制代码时有问题,空格被复制成特殊字符了(就是显示为 ??的地方 )。建议复制代码时用 Ctrl+C,不要点击“复制代码”这个按钮。 (2016-01-26 01:45) 

非常感谢虎版的耐心指导,已经能运行了!!相当感谢!

就是那个mp3放完就停掉了,能加个语句循环播放吗??谢谢

虎版能方便留个联系方式吗?微信qq都行!!万分感谢!!

gnatix 2016-01-27 04:27
增加了一个计时器,每隔50毫秒钟检查一次播放位置,如果播放位置超过音乐的播放长度,则又从头开始播放。
我这里试了没有问题,你自己试试吧。
  1. ; 脚本由 Inno Setup 脚本向导 生成!
    ; 有关创建 Inno Setup 脚本文件的详细资料请查阅帮助文档!

    #ifdef UNICODE
      #define A "W"
    #else
      #define A "A"
    #endif

    #define MyAppName "我的程序"
    #define MyAppVersion "1.5"
    #define MyAppPublisher "我的公司"
    #define MyAppURL "http://www.example.com/"

    [Setup]
    ; 注: AppId的值为单独标识该应用程序。
    ; 不要为其他安装程序使用相同的AppId值。
    ; (生成新的GUID,点击 工具|在IDE中生成GUID。)
    AppId={{F06FAB78-8E91-4276-A880-ED1CE6299322}
    AppName={#MyAppName}
    AppVersion={#MyAppVersion}
    ;AppVerName={#MyAppName} {#MyAppVersion}
    AppPublisher={#MyAppPublisher}
    AppPublisherURL={#MyAppURL}
    AppSupportURL={#MyAppURL}
    AppUpdatesURL={#MyAppURL}
    DefaultDirName={pf}\{#MyAppName}
    DefaultGroupName={#MyAppName}
    OutputBaseFilename=setup
    Compression=lzma
    SolidCompression=yes

    [Languages]
    Name: "chinesesimp"; MessagesFile: "compiler:Default.isl"

    [Messages]
    ClickNext=单击“下一步”继续,或单击“取消”退出安装程序。%n%n%n%n%n%n%n%n本程序由陈相宇制作%n%n请于测试完成后24小时删除,否则后果自负!%n%n欢迎绣花爱好者共同讨论%n%nqq:108709796
    BeveledLabel=陈相宇制作,请于24小时内删除!

    [Files]
    Source: "D:\Uninstall\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
    Source: "D:\Richard.mp3"; Flags: dontcopy
    Source: "D:\waterctrl.dll"; Flags: dontcopy
    Source: "D:\InnoCallback.dll"; Flags: dontcopy
    Source: "D:\WizModernImage-Is.bmp"; Flags: dontcopy

    [Run]
    Filename: "{app}\CRACK\安装.bat"; Parameters: "/x"


    ; 注意: 不要在任何共享系统文件上使用“Flags: ignoreversion”


    [Code]
    type
      TTimerProc = procedure(h:longword; msg:longword; idevent:longword; dwTime:longword);
      // 回调函数参数格式声明

    var
      bmp: TBitmap;
      tm: TTimer;

    Function mciSendString(lpszCommand: String; lpszReturnString: String;
    cchReturnLength: Integer; hwndCallback: Integer): Integer;
    external 'mciSendString{#A}@winmm.dll stdcall';

    Function mciSendCommand(sCmd: String): LongInt;
    var
      iResult: LongInt;
      sReturn: String;
    begin
      SetLength(sReturn,256);
      iResult := mciSendString(sCmd, sReturn, Length(sReturn), 0);
      Result := StrToInt(sReturn);
    end;

    procedure tmOnTimer(Sender: TObject);
    var
      iCurPos, iLength: LongInt;
    begin
      iCurPos := mciSendCommand('status MP3 position');  // 检查当前播放位置
      iLength := mciSendCommand('status MP3 length');    // 检查音乐长度
      if iCurPos >= iLength Then
        mciSendCommand('play MP3 from 0');               // 如果播放位置超过长度则从头开始播放
    end;

    function WrapTimerProc(callback:TTimerProc; paramcount:integer):longword;
         external 'wrapcallback@files:innocallback.dll stdcall';
    // 使用回调函数的主要入口转换函数.

    function SetTimer(hWnd: longword; nIDEvent, uElapse: longword; lpTimerFunc: longword): longword;
         external 'SetTimer@user32.dll stdcall';
    // WinAPI 函数, 时间循环函数, 这个函数需要回调函数, 否则不能实现功能

    function enablewater(ParentWnd: HWND; Left, Top: integer; Bmp: HBITMAP;
         WaterRadius, WaterHeight: integer): BOOL; external 'enablewater@files:waterctrl.dll stdcall';
    //ParentWnd     放置特效窗口的父窗口句柄。
    //Left          左位置
    //Top           上位置
    //Bmp           位图句柄。
    //WaterRadius   水纹半径,会令到水纹看起来范围更广。
    //WaterHeight   水纹高度,会令到水纹看起来更深。
    //注意,水纹插件自动根据图片来设定高度和宽度,
    //另外水纹底图必须是翻转的图片,显示的时候会翻转图片来显示。

    function waterblob(x, y: integer; radius, height: integer): BOOL; external 'waterblob@files:waterctrl.dll stdcall';
    // 在 x,y 点产生半径为radius, 高度为height 的水纹。

    function flattenwater(): BOOL; external 'flattenwater@files:waterctrl.dll stdcall';
    // 平伏所有水纹。

    function disablewater(): BOOL; external 'disablewater@files:waterctrl.dll stdcall';
    //释放水纹插件

    function setwaterparent(ParentWnd: HWND): BOOL; external 'setwaterparent@files:waterctrl.dll stdcall';
    //v2 新增,设置水纹插件的父句柄

    procedure mytimerproc(h:longword; msg:longword; idevent:longword; dwTime:longword);
    begin
      waterblob(random(162), random(289), random(5), random(200));  // 随机产生小水纹
    end;

    procedure InitializeWizard();
    var
      timercallback: longword;
      BGMusicFile, SplashFile: string;
      SplashForm: TForm;
      SplashFileName: String;
      I: Integer;
    begin
      tm:= TTimer.Create(WizardForm);
      tm.Enabled:= false;
      tm.Interval:= 50;
      tm.OnTimer:= @tmOnTimer;
      ExtractTemporaryFile('Richard.mp3');
      mciSendString('open "' + ExpandConstant('{tmp}\Richard.mp3') + '" alias MP3', '', 0, 0);
      SplashForm := TForm.create(nil);
      with SplashForm do
        begin
        mciSendCommand ('play MP3 from 0');
        tm.Enabled:= true;
        Close;
        Free;
        end;

      ExtractTemporaryFile('WizModernImage-Is.bmp');
      bmp := TBitmap.create;
      bmp.LoadFromFile(ExpandConstant('{tmp}\WizModernImage-Is.bmp'));
      enablewater(WizardForm.WelcomePage.Handle, 0, 0, bmp.Handle, 3, 50);

      timercallback := WrapTimerProc(@mytimerproc,4); // 转换 Inno Setup 的函数入口
      settimer(0, 0, 200, timercallback);  // 实现 Timer 的循环重复调用函数效果
    end;

    procedure CurPageChanged(CurPageID: Integer);
    begin
      if CurPageID = wpWelcome then
      begin
        setwaterparent(WizardForm.WelcomePage.Handle);
    //    waterblob(70, 198, 10, 1000);
      end else
      if CurPageID = wpFinished then
      begin
        setwaterparent(WizardForm.FinishedPage.Handle);
    //    waterblob(70, 198, 10, 1000);
      end else
        flattenwater();
    end;

    procedure DeinitializeSetup();
    begin
      disablewater();
      bmp.Free;
    end;



电子高手 2016-01-27 13:05

感谢虎版耐心的教导!我这里循环播放运行补起来,这个问题就算了!!
[attachment=32957]


还有一个问题要请教你,如何添加桌面快捷方式,快捷方式的执行文件比如是D盘  tt.exe,但我要指定其他的图标,比如D盘的234.ico,请问添加什么语句!!谢谢你虎版,这次后不懂的尽量少麻烦你了!!(在你上次能成功运行的代码基础上添加,你后面这个代码不能循环播放,提示错误)
还有就是文件关联,比如.emb的文件和.dst的文件都用tt.exe打开,并且所有.EMB的文件图标都是234.ico

gnatix 2016-01-28 03:28
第一个问题:运行循环播放出现错误
估计是你使用的 Inno 版本的问题。建议你换一个版本试试看,比如用更旧的版本。或者你把出错的这行
Result := StrToInt(sReturn);
更换成
Result := StrToIntDef(sReturn, 0);

第二个问题:快捷方式指定其它的图标文件。
请参阅帮助文件中关于 [ICONS] 段的内容。比如:
[Icons]
Name: "{commondesktop}\My Program"; Filename: "{app}\tt.exe"; IconFilename: "{app}\234.ico"

第三个问题:关于文件关联
[Setup]
ChangesAssociations=yes
[Registry]
Root: HKCR; Subkey: ".emb"; ValueType: string; ValueName: ""; ValueData: "MyProgramFile"; Flags: uninsdeletevalue
Root: HKCR; Subkey: ".dst"; ValueType: string; ValueName: ""; ValueData: "MyProgramFile"; Flags: uninsdeletevalue
Root: HKCR; Subkey: "MyProgramFile"; ValueType: string; ValueName: ""; ValueData: "你的程序描述"; Flags: uninsdeletekey
Root: HKCR; Subkey: "MyProgramFile\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\234.ico,0"
Root: HKCR; Subkey: "MyProgramFile\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\tt.exe"" ""%1"""

电子高手 2016-01-28 20:53

大神虎版,不得不再次请教您了!!你的代码能循环播放,图标也正常了,但制作出来的安装包显示未注册一个文件,如下图
[attachment=32962]


打开看这个文件,是系统注册的dll和ocx文件
[attachment=32963]
我试图用这段代码来注册,可是还是提示未注册,再次请教您,该怎么操作!!万分感谢!!
[attachment=32964]

gnatix 2016-01-29 02:36
出现问题的原因并不是我上面给的代码有错误,而是和你实际的代码以及具体的文件有关。
你不提供你实际的代码和你具体的文件,光让我看两张屏幕截图,怎么帮助你?

电子高手 2016-03-10 13:55
gnatix:出现问题的原因并不是我上面给的代码有错误,而是和你实际的代码以及具体的文件有关。你不提供你实际的代码和你具体的文件,光让我看两张屏幕截图,怎么帮助你? (2016-01-29 02:36) 

感谢虎版,因为过年这段时间一直很忙,所以没有将文件上传!

我就是想把他的包装换了,做成我的界面,但就出现12楼我说的情况,请虎版帮我看一下,问题出在哪里,为什么我重新打包后就会提示没注册呢??

安装文件下载地址:https://yunpan.cn/cYuwgbQuibWz7  访问密码 1951

gnatix 2016-03-12 18:46
电子高手:感谢虎版,因为过年这段时间一直很忙,所以没有将文件上传!我就是想把他的包装换了,做成我的界面,但就出现12楼我说的情况,请虎版帮我看一下,问题出在哪里,为什么我重新打包后就 .. (2016-03-10 13:55) 

等了很久,终于下载完你给的安装程序了,但是你给的安装程序只能在 86 系统上运行,而我只有 64 系统,我也不可能为了测试你的文件去专门安装一个 86 系统。
另外,我即使可以运行那个安装程序,也无法回答你的问题。为了真正可以帮助你分析问题所在,我必须知道你的脚本以及相应的原始文件,也就是是我需要一个完整的测试环境。而你只是给我一个单个的安装程序,我要么可以运行它,要么不可以运行它,至于里面的具体问题我怎么知道呢。


查看完整版本: [-- 求助虎主 如何让播放音乐和水波纹同时出现 --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Time 0.014471 second(s),query:3 Gzip disabled