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

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: InnoSetup是一个易于使用的安装包制作工具,它提供了丰富的安装选项和自定义功能。在使用InnoSetup制作安装包时,我们可以通过自定义安装界面来满足客户的各种需求。 通过InnoSetup的宏命令和脚本语言,我们可以轻松地修改默认的安装界面,例如添加自定义控件、更改按钮文本、更改字体和颜色等。可以使用Pascal脚本和Delphi Object Pascal语言。 要自定义安装界面,我们需要首先打开InnoSetup脚本文件(.iss文件)并找到“[Setup]”部分。在这里,我们可以设置安装程序的各种选项,例如安装的目标路径、是否需要安装桌面快捷方式、是否需要安装开始菜单项等等。 然后,我们可以添加新的页面和自定义控件,例如选择安装选项的页面、选择安装路径的页面、选择应用程序图标的页面等等。我们可以使用InnoSetup自带的控件,也可以使用自定义控件来实现更复杂的功能。 最后,我们可以为每个页面添加Pascal脚本来实现自定义逻辑,例如检查安装目录是否已存在、检查系统是否已安装必要的组件等等。 总之,InnoSetup提供了灵活的自定义安装界面功能,让我们可以满足不同客户的需求,并提高软件的用户体验。 ### 回答2: Inno Setup 可以在安装过程中自定义安装界面,使其更符合特定的软件需求和个性化需求。通过自定义安装界面,可以加强用户交互体验,提高软件的可用性和易用性,同时也可以为软件提供更精细的管理和控制。下面将分别从设计理念、开发流程和技术实现方面进行介绍。 设计理念 Inno Setup自定义安装界面开发过程,从本质上来说是一次用户交互设计 (User Experience Design, UXD) 的过程。通过 UXD,设计师可以了解客户的需求、喜好和习惯,进而设计出更符合其需求的产品和服务。在自定义安装界面开发流程中,设计师需要考虑以下几个方面: 1. 界面设计。界面设计应该简单明了、美观大方,能够吸引用户的注意力并提高用户的参与度。同时需要考虑不同用户的操作习惯和口味,以达到更广泛的用户群体。 2. 用户体验 (User Experience, UX) 设计。在设计界面时,需要考虑到用户的体验。例如:简化繁琐的操作、提供更多的选择、给予良好的反馈等都是好的用户体验设计。 3. 交互设计。特别是在软件界面方面,设计师需要思考用户将与之如何交互,如何设定第一时间与其进行沟通交流。 开发流程 在设计理念上确定了之后,我们需要有一个中间人对需求进行保存和整理。通常情况下需要特别有经验的的开发人员还需要具备美工能力,能够从业务流程到界面交互再到发布之间都能够进行系统性的构建和实践。 首先,需要准备安装向导的图片资源、控件资源等基本素材,并制定对应的管理策略。然后在1.4版本以上的 Inno Setup 中,我们可以手动复制 Setup 向导的默认源文件,再进行相应的更改即可。 接着,需要使用 Pascal 编写脚本来确保安装向导能够正确检测到用户的操作,以及完成相应的安装任务。同时,还需要定义安装向导的菜单项、默认值、文件读取方式等,以方便用户进行自定义设置和个性化操作。 最后,在整个自定义安装界面开发完成后,我们需要使用 Inno Setup 自带的编译器工具将代码打包并生成可供安装安装包,从而方便用户进行安装和使用。 技术实现方案 实现自定义安装界面的技术方案主要分为以下几个方面: 1. 界面设计工具。可以选择比较流行的界面设计工具,如 Adobe Photoshop,Axure RP,Sketch 等,这些工具都具有快速地设计复杂界面的能力。 2. 编程语言。Inno Setup 采用 Pascal 语言编写,因此需要对 Pascal 语言有一定的了解和掌握基本的编程技能。 3. Inno Setup 插件。InnoSetup 提供了一系列插件,可以方便我们在安装向导中引入大量有用的功能,如申请服务权限、加密等。 需要注意的是,Inno Setup 自定义安装界面开发风格应该以简单、实用、易于维护为原则,在设计时需要注意不要过于复杂和繁琐,以方便用户进行快速的操作和安装。 ### 回答3: Inno Setup是一款功能强大的安装程序制作软件,它可以帮助开发者快速的制作出安装程序。而自定义安装界面则是Inno Setup所提供的一个很实用的功能之一,它可以使得开发者可以自由的设计自己的安装界面,让用户有一个更加舒适的安装体验。 首先,我们需要了解Inno Setup自定义安装界面的实现方式。整个安装过程中,Inno Setup会按照一定的流程逐步展示各个界面,在每一个界面上,开发者都可以通过界面的设计和编写代码来进行自定义。 在设计安装界面时,我们可以使用Inno Setup自带的画布工具或者其他画图工具来设计出自己喜欢的安装界面,然后通过Inno Setup的代码来添加各种控件和事件。例如,我们可以添加各种按钮、文本框、进度条、复选框等控件,并通过代码来控制它们的显示和行为。 接下来,我们需要考虑自定义安装界面需要实现哪些功能。例如,我们可能需要在安装界面中添加自己的公司Logo、版本号、安装路径等信息,或者添加一些用户需要填写的信息,比如用户的名称、电子邮件和密码等。如果需要,我们也可以添加自己的安装协议和许可协议,并让用户需要点击同意才能继续安装。 总的来说,Inno Setup自定义安装界面功能非常强大,可以让开发者灵活的设计和实现自己的安装界面。但是需要注意的是,设计一个良好的安装界面需要考虑到用户的体验和操作方式,所以我们需要仔细考虑每一个控件的设计和布局,让用户能够尽可能的了解整个安装过程,并且保持简洁和易于操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值