zoukankan      html  css  js  c++  java
  • Inno Setup自定义安装界面脚本

    ; 脚本由 Inno Setup 脚本向导 生成!
    ; 有关创建 Inno Setup 脚本文件的详细资料请查阅帮助文档!
    
    #define MyAppName "RemoteCard"
    #define MyAppVersion "1.0"
    #define MyAppPublisher "RemoteCard"
    #define MyAppURL "http://www.example.com/"
    #define MyAppExeName "RemoteCard.exe"
    
    [Setup]
    ; 注: AppId的值为单独标识该应用程序。
    ; 不要为其他安装程序使用相同的AppId值。
    ; (生成新的GUID,点击 工具|在IDE中生成GUID。)
    AppId={{C19C0F44-A8D2-4863-AFAA-AED21E50C603}
    AppName={#MyAppName}
    AppVersion={#MyAppVersion}
    AppPublisher={#MyAppPublisher}
    AppPublisherURL={#MyAppURL}
    AppSupportURL={#MyAppURL}
    AppUpdatesURL={#MyAppURL}
    DefaultDirName={pf}{#MyAppName}
    DisableProgramGroupPage=yes
    OutputDir=app
    OutputBaseFilename=RemoteCardInstall
    SetupIconFile=tmpRemoteCard.ico
    Compression=lzma
    SolidCompression=yes
    
    [Languages]
    Name: "chinesesimp"; MessagesFile: "compiler:Default.isl"
    
    [Tasks]
    Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: checkablealone; OnlyBelowVersion: 0,8.1
    
    [Files]
    Source: "RemoteCard.exe"; DestDir: "{app}"; Flags: ignoreversion
    Source: "jre*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
    Source: "tmp*"; DestDir: "{tmp}"; Flags: dontcopy solidbreak ; Attribs: hidden system
    ; 注意: 不要在任何共享系统文件上使用“Flags: ignoreversion”
    ; 安装前判断进程,dll文件放在inno的安装目录中
    Source: compiler:psvince.dll; Flags: dontcopy 
    Source: compiler:IsTask.dll; Flags: dontcopy 
    [Icons]
    //开始菜单快捷方式
    Name: "{commonprograms}{#MyAppName}"; Filename: "{app}{#MyAppExeName}"
    //桌面快捷方式
    Name: "{commondesktop}{#MyAppName}"; Filename: "{app}{#MyAppExeName}"; Tasks: desktopicon
    //开始菜单卸载程序
    Name: {commonprograms}卸载 {#MyAppName}; Filename:{uninstallexe}; WorkingDir: {app};
    
    
    [Run]
    Filename: "{app}{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent
    
    
    [code]
    #include  'dll.iss'
    
    
    var
      label2,label3:TLabel;
      BGimg:longint;
      btn_next,licenseBtn,MinBtn,CancelBtn,btn_cancel,btn_Browser,btn_setup,dirback,btnBack:HWND;
      pathEdit:tedit;
      licenseImg,progressbgImgbk,progressImg,progressbgImg,PBOldProc:longint;
      Timer1: TTimer;
      licenseCheck:HWND;
      licenseRich:TRichEditViewer;
    
    Function desktop(): Boolean;
    begin
      Result :=true;
    end;
    
    
    procedure btn_cancelclick(hBtn:HWND);
    begin
     WizardForm.CancelButton.Click;
    end;
    
      //浏览选择安装目录按钮
    procedure btn_Browserclick(hBtn:HWND);
    begin
      WizardForm.DirBrowseButton.Click;
      pathEdit.text := WizardForm.DirEdit.text;
    end;
    
    //返回按钮
    procedure dirbackclick(hBtn:HWND);
    begin
      WizardForm.BackButton.Click;
      label2.Show;
      licenseRich.Height:=0;
      ImgSetVisibility(BGimg,false);
      BGimg:=ImgLoad(WizardForm.Handle,ExpandConstant('{tmp}g1.png'),0,0,590,300,false,true);
      ImgApplyChanges(WizardForm.Handle);
      label3.Hide;
      pathEdit.Hide;
      BtnSetVisibility(btn_Browser,false);
      BtnSetVisibility(btn_setup,false);
      BtnSetVisibility(dirback,false);
      BtnSetVisibility(licenseCheck,true);
      BtnSetVisibility(licenseBtn,true);
      BtnSetVisibility(btn_next,true);
    end;
    
    //立即安装按钮
    procedure btn_setupclick(hBtn:HWND);
    begin
      WizardForm.NextButton.Click;
    
      WizardForm.NextButton.Click;
    end;
    
    procedure pathEditChange(Sender: TObject);
    begin
      WizardForm.DirEdit.text:=pathEdit.Text ;
    end;
    
    //下一步按钮
    procedure btn_nextclick(hBtn:HWND);
    begin
      WizardForm.NextButton.Click;
      licenseRich.Height:=0;
      ImgSetVisibility(BGimg,false);
      BGimg:=ImgLoad(WizardForm.Handle,ExpandConstant('{tmp}chcek_dir.png'),0,0,590,100,false,true);
      ImgApplyChanges(WizardForm.Handle);
      label3.Show;
      label2.Hide;
      label3.Caption:='安装位置';
      pathEdit.show;
      BtnSetVisibility(btn_Browser,true);
      BtnSetVisibility(btn_setup,true);
      BtnSetVisibility(dirback,true);
      BtnSetVisibility(licenseCheck,false)
      BtnSetVisibility(licenseBtn,false)
      BtnSetVisibility(btn_next,false)
    end;
    
    //用户协议的勾选框
    procedure check_licenseclick(hBtn:HWND);
    begin
        if BtnGetChecked(licenseCheck)=true then
        begin
           BtnSetEnabled(btn_next,true)
        end
        else
        begin
           BtnSetEnabled(btn_next,false)
        end
    end;
    
      //点击阅读协议按钮
    procedure locklicenseclick(hBtn:HWND);
    begin
      label2.Hide;
      licenseRich.Height:=250
      ImgSetVisibility(BGimg,false);
      BGimg:=ImgLoad(WizardForm.Handle,ExpandConstant('{tmp}g_license.png'),0,0,590,100,false,true);
      ImgApplyChanges(WizardForm.Handle);
      BtnSetVisibility(licenseCheck,false)
      BtnSetVisibility(licenseBtn,false)
      BtnSetVisibility(btn_next,false)
      BtnSetVisibility(btn_setup,false)
      BtnSetVisibility(dirback,true);
    end;
    
    //进度条
    function PBProc(h:hWnd;Msg,wParam,lParam:Longint):Longint;
    var
      pr,i1,i2 : Extended;
      w : integer;
    begin
      Result:=CallWindowProc(PBOldProc,h,Msg,wParam,lParam);
      if (Msg=$402) and (WizardForm.ProgressGauge.Position>WizardForm.ProgressGauge.Min) then
      begin
        i1:=WizardForm.ProgressGauge.Position-WizardForm.ProgressGauge.Min;
        i2:=WizardForm.ProgressGauge.Max-WizardForm.ProgressGauge.Min;
        pr:=i1*100/i2;
        w:=Round(530*pr/100);
        ImgSetPosition(progressImg,30,195,w,15);
        ImgSetVisiblePart(progressImg,30,0,w,15);
        ImgApplyChanges(WizardForm.Handle);
      end;
    end;
    
    procedure InitializeWizard();
    begin
      WizardForm.OuterNotebook.hide;
      WizardForm.Bevel.Hide;
      WizardForm.Position:=poDesktopCenter;
      WizardForm.Width:=590;
      WizardForm.Height:=475;
      WizardForm.Color:=clWhite ;
    
      ExtractTemporaryFile('bg1.png');
      ExtractTemporaryFile('btn_next.png');
      ExtractTemporaryFile('checkbox.png');
      ExtractTemporaryFile('license.png');
    
      ExtractTemporaryFile('chcek_dir.png');
      ExtractTemporaryFile('btn_Browser.png');
      ExtractTemporaryFile('back.png');
      ExtractTemporaryFile('btn_steup.png');
    
      ExtractTemporaryFile('bg_license.png');
      ExtractTemporaryFile('license.rtf');
    
      ExtractTemporaryFile('loading_pic.png');
      ExtractTemporaryFile('btn_cancel.png');
      ExtractTemporaryFile('loading.png');
      ExtractTemporaryFile('loading_bg.png');
    
      ExtractTemporaryFile('btn_complete.png');
      ExtractTemporaryFile('finish_bg.png');
    
      //浏览按钮
      btn_Browser:=BtnCreate(WizardForm.Handle,480,180,80,31,ExpandConstant('{tmp}tn_Browser.png'),1,false)
      BtnSetEvent(btn_Browser,BtnClickEventID,WrapBtnCallback(@btn_Browserclick,1));
      BtnSetVisibility(btn_Browser,false);
    
      //返回按钮
      dirback:=BtnCreate(WizardForm.Handle,490,385,68,29,ExpandConstant('{tmp}ack.png'),1,false)
      BtnSetEvent(dirback,BtnClickEventID,WrapBtnCallback(@dirbackclick,1));
      BtnSetVisibility(dirback,false);
    
      //立即安装
      btn_setup:=BtnCreate(WizardForm.Handle,400,385,80,29,ExpandConstant('{tmp}tn_steup.png'),2,false)
      BtnSetEvent(btn_setup,BtnClickEventID,WrapBtnCallback(@btn_setupclick,1));
      BtnSetVisibility(btn_setup,false);
    
      //取消
      btn_cancel:=BtnCreate(WizardForm.Handle,490,380,68,29,ExpandConstant('{tmp}tn_cancel.png'),2,false)
      BtnSetEvent(btn_cancel,BtnClickEventID,WrapBtnCallback(@btn_cancelclick,1));
      BtnSetVisibility(btn_cancel,false);
    
      //许可协议勾选框
      licenseCheck:=BtnCreate(WizardForm.Handle,30,375,15,15,ExpandConstant('{tmp}checkbox.png'),1,true)
      BtnSetEvent(licenseCheck,BtnClickEventID,WrapBtnCallback(@check_licenseclick,1));
      BtnSetChecked(licenseCheck,true);
    
      //阅读许可协议
      licenseBtn:=BtnCreate(WizardForm.Handle,200,377,86,12,ExpandConstant('{tmp}license.png'),1,false)
      BtnSetEvent(licenseBtn,BtnClickEventID,WrapBtnCallback(@locklicenseclick,1));
    
       //下一步
      btn_next:=BtnCreate(WizardForm.Handle,490,369,68,29,ExpandConstant('{tmp}tn_next.png'),1,false)
      BtnSetEvent(btn_next,BtnClickEventID,WrapBtnCallback(@btn_nextclick,4));
    
      label2:= TLabel.Create(WizardForm);
      with label2 do
      begin
      Parent := WizardForm;
      Caption := '我已阅读同意EIP7远程打卡';
      Font.Size:=9;
      Font.Name:='微软雅黑'
      Color := $00666666
      Transparent := TRUE;
      SetBounds(52 ,375,200,20)
      end;
    
      //安装过程中的提示
      label3:= TLabel.Create(WizardForm);
      with label3 do
      begin
      Parent := WizardForm;
      Caption := '';
      Font.Size:=12;
      Font.Name:='微软雅黑'
      Color := $00666666
      Transparent := TRUE;
      SetBounds(30 ,145,200,20)
      end;
    
      //安装路径,默认不显示
      pathEdit:= TEdit.Create(WizardForm);
      with pathEdit do
      begin
        Parent := WizardForm;
        text :=WizardForm.DirEdit.text;
        Font.Name:='微软雅黑'
        Font.Color:=$00666666
        SetBounds(30,181,440,35);
        OnChange:=@pathEditChange;
        Color := $00ffffff
        TabStop :=false;
         Font.Size:=12;
      end;
      pathEdit.Hide;
      pathEdit.AutoSelect:=true;
    
       //加载许可协议
      licenseRich:= TRichEditViewer.Create(WizardForm);
      with licenseRich do
      begin
      Parent := WizardForm;
      ReadOnly:= true;
      SCROLLBARS:= ssVertical;
      font.Name:='微软雅黑'
      Color:=clWhite;
      SetBounds(30,120,530,250)
      Lines.LoadFromFile(ExpandConstant('{tmp}license.rtf'));
      TabStop:=false;
      Height := 0;
      end;
    
    
      PBOldProc:=SetWindowLong(WizardForm.ProgressGauge.Handle,-4,PBCallBack(@PBProc,4));
      Timer1 := TTimer.Create(WizardForm);
    end;
    
    
     //该过程在安装终止时被调用,注意及时在用户没有安装任何文件之前退出也会被调用。
    procedure DeinitializeSetup();
    begin
      gdipShutdown;
    end;
    
    
    procedure CurPageChanged(CurPageID: Integer);
    begin
      //把原始的按钮屏蔽掉
      WizardForm.NextButton.Visible:=false;
      WizardForm.CancelButton.Height:=0;
      WizardForm.BackButton.Height:=0;
    
       //进入安装界面
      if CurPageID=wpWelcome then
      begin
    
       WizardForm.NextButton.Click;
       //背景图片
      BGimg:=ImgLoad(WizardForm.Handle,ExpandConstant('{tmp}g1.png'),0,0,590,314,false,true);
      WizardForm.Width:=590;
      WizardForm.Show;
      end
    
      //正在安装
      if CurPageID = wpInstalling then
      begin
      pathEdit.Hide;
      BtnSetVisibility(btn_Browser,false)
      WizardForm.Height:=460
      BtnSetVisibility(dirback,false)
      BtnSetVisibility(licenseBtn,false);
      BtnSetVisibility(licenseCheck,false);
      BtnSetVisibility(btn_cancel,true);
      ImgSetVisibility(BGimg,false);
      BGimg:=ImgLoad(WizardForm.Handle,ExpandConstant('{tmp}loading_pic.png'),0,0,590,105,false,true);
      progressbgImg:=ImgLoad(WizardForm.Handle,ExpandConstant('{tmp}loading_bg.png'),30,195,530,15,true,true);
      progressImg:=ImgLoad(WizardForm.Handle,ExpandConstant('{tmp}loading.png'),30,195,0,0,True,True);
      BtnSetVisibility(btn_setup,false);
      label2.Hide;
      label3.Show;
      label3.Caption:='正在安装...';
      label3.SetBounds(30,145,200,20);
      label3.Font.Size:=16;
      Timer1.Interval:=500;
      end
    
      //安装完成
      if CurPageID = wpFinished then
      begin
      Timer1.Interval:=0
      ImgSetVisibility(progressbgImgbk,false)
      ImgSetVisibility(progressbgImg,false)
       ImgSetVisibility(progressImg,false)
      btn_setup:=BtnCreate(WizardForm.Handle,180,354,230,47,ExpandConstant('{tmp}tn_complete.png'),2,false)
      BtnSetEvent(btn_setup,BtnClickEventID,WrapBtnCallback(@btn_setupclick,1));
      BGimg:=ImgLoad(WizardForm.Handle,ExpandConstant('{tmp}finish_bg.png'),0,0,590,315,false,true);
      label3.Hide;
      label2.Hide;
      BtnSetVisibility(btn_cancel,false);
      end
    
      ImgApplyChanges(WizardForm.Handle)
    end;
    
    function ShouldSkipPage(PageID: Integer): Boolean;
    begin
        if (PageID=wpSelectComponents)  then    //跳过组件安装界面
        result := true;
    end;
    
    //安装和卸载前的判断:http://blog.sina.com.cn/s/blog_a6fb6cc90102vh93.html
    function RunTask(FileName: string; bFullpath: Boolean): Boolean;
    external 'RunTask@files:ISTask.dll stdcall delayload';
    function KillTask(ExeFileName: string): Integer;
    external 'KillTask@files:ISTask.dll stdcall delayload';
    function IsModuleLoaded(modulename: AnsiString ):  Boolean;
    external 'IsModuleLoaded@files:psvince.dll stdcall';
    function IsAppRunning(const FileName : string): Boolean;
    var
        FSWbemLocator: Variant;
        FWMIService   : Variant;
        FWbemObjectSet: Variant;
    begin
        Result := false;
        try
          FSWbemLocator := CreateOleObject('WBEMScripting.SWBEMLocator');
          FWMIService := FSWbemLocator.ConnectServer('', 'rootCIMV2', '', '');
          FWbemObjectSet := FWMIService.ExecQuery(Format('SELECT Name FROM Win32_Process Where Name="%s"',[FileName]));
          Result := (FWbemObjectSet.Count > 0);
          FWbemObjectSet := Unassigned;
          FWMIService := Unassigned;
          FSWbemLocator := Unassigned;
        except
          if (IsModuleLoaded(FileName)) then
            begin
              Result := false;
            end
          else
            begin
              Result := true;
            end
          end;
    end;
    
    //安装前判断是否运行
    function InitializeSetup(): Boolean;
    begin
      Result := true;
      if  IsAppRunning('{#MyAppExeName}') then
        begin
          if MsgBox('安装程序检测到 {#MyAppName} 正在运行!'#13''#13'单击“是”按钮关闭程序并继续安装;'#13''#13'单击“否”按钮退出安装!', mbConfirmation, MB_YESNO) = IDYES then
            begin
            KillTask('{#MyAppExeName}');
            Result:= true;
            end
          else
          Result:= false;
        end;
    end;
    
    //卸载前判断是否运行
    function InitializeUninstall(): Boolean;
    begin
      Result:= true;
      if  IsAppRunning('{#MyAppExeName}') then
      begin
      MsgBox('卸载程序检测到 {#MyAppName} 正在运行!请退出后再进行卸载操作!', mbInformation, MB_ICONINFORMATION)
      Result:= false;
      end;
    end;
      
     //卸载后删除文件夹
    procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
    begin
      if CurUninstallStep = usDone then
      DelTree(ExpandConstant('{app}'), True, True, True);
    end;

    下载地址:http://download.csdn.net/download/u013865056/9959092

  • 相关阅读:
    2019.6.20刷题统计
    36 线程 队列 守护线程 互斥锁 死锁 可重入锁 信号量
    35 守护进程 互斥锁 IPC 共享内存 的方式 生产者消费者模型
    34 进程 pid ppid 并发与并行,阻塞与非阻塞 join函数 process对象 孤儿进程与僵尸进程
    33 udp 域名 进程
    32 粘包 文件传输
    31 socket客户端. 服务器 异常 语法
    30 网络编程
    29 元类 异常
    26 封装 反射 常用内置函数
  • 原文地址:https://www.cnblogs.com/zhangjinru123/p/7519052.html
Copyright © 2011-2022 走看看