当前位置: 首页 > news >正文

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=tmp\RemoteCard.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}\bg1.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}\bg_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}\btn_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}\back.png'),1,false)
  BtnSetEvent(dirback,BtnClickEventID,WrapBtnCallback(@dirbackclick,1));
  BtnSetVisibility(dirback,false);

  //立即安装
  btn_setup:=BtnCreate(WizardForm.Handle,400,385,80,29,ExpandConstant('{tmp}\btn_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}\btn_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}\btn_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}\bg1.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}\btn_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('', 'root\CIMV2', '', '');
      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

转载于:https://www.cnblogs.com/zhangjinru123/p/7519052.html

相关文章:

  • Spring AOP简单的配置(注解和xml配置)
  • Swift,枚举
  • java操作Excel
  • 'NoneType' object is not iterable
  • AngularJS
  • C++ 清空队列(queue)的几种方法
  • MIME 类型(HttpContext.Response.ContentType)列表
  • 从微信官方获取微信公众号名片:https://open.weixin.qq.com/qr/code?username=haihongruanjian...
  • 分享 - 27 个机器学习、数学、Python 速查表
  • 浅析设计模式
  • 【BZOJ3331】[BeiJing2013]压力 Tarjan求点双
  • idea插件之——在markdown复制粘贴图片
  • Encourage_by_WeChat
  • 目标检测应用化之web页面(YOLO、SSD等)
  • 父类和子类(指针,对象,引用 ,盲点)
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • CentOS6 编译安装 redis-3.2.3
  • ES6 ...操作符
  • Java 内存分配及垃圾回收机制初探
  • JavaScript 基本功--面试宝典
  • laravel 用artisan创建自己的模板
  • Logstash 参考指南(目录)
  • nfs客户端进程变D,延伸linux的lock
  • nodejs:开发并发布一个nodejs包
  • Phpstorm怎样批量删除空行?
  • vue总结
  • 闭包--闭包之tab栏切换(四)
  • 分布式任务队列Celery
  • 和 || 运算
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 理解在java “”i=i++;”所发生的事情
  • 两列自适应布局方案整理
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 用jQuery怎么做到前后端分离
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • # Java NIO(一)FileChannel
  • # 数据结构
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (python)数据结构---字典
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (二十四)Flask之flask-session组件
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (三)终结任务
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • .NET delegate 委托 、 Event 事件
  • .NET 反射 Reflect
  • .net安装_还在用第三方安装.NET?Win10自带.NET3.5安装
  • .net和jar包windows服务部署
  • .net通用权限框架B/S (三)--MODEL层(2)
  • .NET中使用Protobuffer 实现序列化和反序列化
  • 。Net下Windows服务程序开发疑惑