您的位置:首页 > 其它

NSIS 自定义安装部署实例

2015-08-18 14:31 357 查看
;安装目录

Var LoadFileLabrary

#自定义页面中的变量

;var txt_LicensePage

;界面上半部分的图片

Var TopImage

;界面的背景图片

Var BGImage

Var ImageHandle

;界面上立即安装的按钮

Var Btn_Install

;Var Bool_Install ;定义的一个Bool值,用于是否显示

;界面关闭按钮

Var Btn_Close

#安装路径的变量

Var Btn_LoadPath

;创建checkBox

Var Ck_AgreeLicense ;界面上同意协议check框

Var Bool_AgreeLicense ;界面上同意协议check框的bool判定

Var Lbl_AgreeLicense ;界面上同意协议lbl文字

;正在安装的界面

#正在安装

;进度条变量

Var PB_ProgressBar

;正在安装的变量

var Lbl_Sumary

;网页控件

Var WebImg

;背景图片

Var BGInstallImage

Var Btn_LoadingPage_Close ;关闭安装界面

Var Lbl_ProgressPercent ;1%

Var ProgressPercent ;进度条中间值

Var txt_ImgPage ;动态图片显示在txt框中

#更改目录的界面

;文本框

Var Txt_Browser

;按钮

Var Btn_Browser

;返回前一页的按钮

Var Btn_BackPath

Var Btn_PathPage_Close ;关闭按钮

#安装完成的界面

Var Bg_FinishImage

Var Btn_Finish ;完成的按钮

Var Btn_FinishPage_Close ;关闭界面的按钮

Var Lbl_DesktopShortCut ;桌面的快捷方式文本

Var Ck_DesktopShortCut ;桌面的快捷方式checkbox

Var Lbl_taskbarpin ;任务栏的快捷方式文本

Var Ck_taskbarpin ;任务栏的快捷方式checkbox

Var Bool_DesktopShortCut ;桌面的快捷方式的bool值判定

Var Bool_taskbarpin ;任务栏的快捷方式的bool值判定

Var J3

Var PRODUCT_NAME

Var PRODUCT_NAMEEXE

Var PRODUCT_INSTALL_KEY

Var PRODUCT_UNINST_KEY

Var PRODUCT_VERSION_NAME

Var PRODUCT_VERSION_NO

Var PRODUCT_OUTFILE_MAIN7z

; 该脚本使用 HM VNISEdit 脚本编辑器向导产生

; 安装程序初始定义常量

!define PRODUCT_NAME "pkpm"

!define PRODUCT_VERSION "1.0"

!define PRODUCT_PUBLISHER "My company, Inc."

!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"

!define PRODUCT_INSTALL_KEY "Software\Microsoft\Windows\CurrentVersion\Install\${PRODUCT_NAME}"

!define PRODUCT_UNINST_ROOT_KEY "HKLM"

SetCompressor lzma

;BrandingText "${EM_BrandingText}"

SetCompress force

XPStyle on

; ------ MUI 现代界面定义 (1.67 版本以上兼容) ------

!include "MUI.nsh"

!include "MUI2.nsh"

!include "WinCore.nsh"

;引用文件函数头文件

!include "FileFunc.nsh"

!include "nsWindows.nsh"

!include "LoadRTF.nsh"

!include "WinMessages.nsh"

;循环语句需要的头文件操作

!include "LogicLib.nsh"

; MUI 预定义常量

!define MUI_ABORTWARNING

;安装图标的路径名字

!define MUI_ICON "images\fav.ico"

;卸载图标的路径名字

!define MUI_UNICON "images\fav.ico"

;自定义初始化

!define MUI_CUSTOMFUNCTION_GUIINIT onGUIInit

;自定义欢迎页面

Page custom WelcomePage

;自定义修改安装路径的页面

Page custom PathPage

;自定义安装进度页面

Page custom LoadingPage

;自定义安装完成页面

Page custom FinishPage

; 欢迎页面

!insertmacro MUI_PAGE_WELCOME

;许可协议页面

!define MUI_LICENSEPAGE_CHECKBOX

!insertmacro MUI_PAGE_LICENSE "aa.txt"

; 安装目录选择页面

!insertmacro MUI_PAGE_DIRECTORY

; 安装过程页面

!insertmacro MUI_PAGE_INSTFILES

; 安装完成页面

!insertmacro MUI_PAGE_FINISH

; 安装卸载过程页面

!insertmacro MUI_UNPAGE_INSTFILES

; 安装界面包含的语言设置

!insertmacro MUI_LANGUAGE "SimpChinese"

; 安装预释放文件

!insertmacro MUI_RESERVEFILE_INSTALLOPTIONS

; ------ MUI 现代界面定义结束 ------

Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"

OutFile "pkpm.exe"

;InstallDir "$PROGRAMFILES\pkpm"

;InstallDir "$INSTDIR\pkpm"

ShowInstDetails show

ShowUnInstDetails show

!define /math PBM_SETRANGE32 ${WM_USER} + 6 #定义nsis未包含的进度条相关常量

#编写:水晶石

InstallDir "C:\pkpm"

!define PRODUCT_OUTFILE_MAIN "Main.7z" #对应主程序压缩包名称

/*

该属性让安装程序去检测一注册表里的一个字串,

如果该字串可用那么把它用来作为安装目录。

如果预置了该属性,当指定的注册表键可用时它会越过 InstallDir 指定的字串,

否则使用默认的 InstallDir 指定值。查询注册表时,该命令将自动截去引号

*/

;!define PRODUCT_INSTALL_KEY "SOFTWARE\PKPM\Electron"

;InstallDirRegKey HKLM Software\NSIS "" 根键 子键 键名

;InstallDirRegKey HKLM "$PRODUCT_INSTALL_KEY" "C:\pkpm"

Section MainSetup

SectionEnd

#检测程序是否正在运行

Function IsProgramRunning

FindProcDLL::FindProc "Electron.exe"

Pop $R0

IntCmp $R0 1 0 no_run

MessageBox MB_ICONSTOP "安装程序检测到 Electron.exe 正在运行,请退出程序后重试"

Quit

no_run:

FunctionEnd

#检查程序的版本号

Function CompareVersion

ReadRegStr $0 HKLM ${PRODUCT_INSTALL_KEY} "Version" ;PRODUCT_VERSION ;用户变量(输出) 根键 子键 项

${IF} $0 != ""

IntCmp ${PRODUCT_VERSION} $0 0 Old New

MessageBox MB_YESNO "安装程序检测到 $PRODUCT_NAME 已经安装,是否覆盖安装" IDYES Y IDNO N

N:

Quit

Old:

MessageBox MB_ICONSTOP "安装程序检测到 $PRODUCT_NAME 已经安装了更新版本"

Quit

New:

MessageBox MB_ICONSTOP "安装程序检测到 $PRODUCT_NAME 已经安装了旧版本,继续更新安装"

${ENDIF}

Y:

FunctionEnd

Function DefineReadINI

SetOutPath $TEMP

SetOverwrite on

File "setup.ini"

ReadINIStr $PRODUCT_NAME $TEMP\setup.ini SETUP_define PRODUCT_NAME

ReadINIStr $PRODUCT_NAMEEXE $TEMP\setup.ini SETUP_define PRODUCT_NAMEEXE

ReadINIStr $PRODUCT_INSTALL_KEY $TEMP\setup.ini SETUP_define PRODUCT_INSTALL_KEY

ReadINIStr $PRODUCT_UNINST_KEY $TEMP\setup.ini SETUP_define PRODUCT_UNINST_KEY

ReadINIStr $PRODUCT_VERSION_NAME $TEMP\setup.ini SETUP_define PRODUCT_VERSION_NAME

ReadINIStr $PRODUCT_VERSION_NO $TEMP\setup.ini SETUP_define PRODUCT_VERSION_NO

ReadINIStr $PRODUCT_OUTFILE_MAIN7z $TEMP\setup.ini SETUP_define PRODUCT_OUTFILE_MAIN7z

FunctionEnd

;初始化必须要调用的组件

Function .onInit

InitPluginsDir

Call IsProgramRunning #检测程序是否正在运行

Call CompareVersion #检查程序的版本号

;显示动态的图片

File `/oname=$PLUGINSDIR\index.html` `images\index.html`

File `/oname=$PLUGINSDIR\loading_pic1.bmp` `images\loading_pic1.bmp`

File `/oname=$PLUGINSDIR\loading_pic2.bmp` `images\loading_pic2.bmp`

File `/oname=$PLUGINSDIR\loading_pic3.bmp` `images\loading_pic3.bmp`

File `/oname=$PLUGINSDIR\loading_pic4.bmp` `images\loading_pic4.bmp`

File `/oname=$PLUGINSDIR\license.rtf` `license\license.rtf`

File `/oname=$PLUGINSDIR\License.html` `images\License.html`

;背景图片

File `/ONAME=$PLUGINSDIR\bg.bmp` `images\bg.bmp`

;顶部图片

File `/ONAME=$PLUGINSDIR\welcome.bmp` `images\welcome.bmp`

File `/ONAME=$PLUGINSDIR\a.png` `images\a.png`

;关闭按钮

File `/oname=$PLUGINSDIR\btn_close.bmp` `images\btn_close.bmp`

;立即安装的图片

File `/oname=$PLUGINSDIR\btn_install.bmp` `images\btn_install.bmp`

;退出的背景图片

File `/ONAME=$PLUGINSDIR\quit.bmp` `images\quit.bmp`

;改变路径的按钮图片

File `/oname=$PLUGINSDIR\btn_agreement1.bmp` `images\btn_agreement1.bmp`

File `/oname=$PLUGINSDIR\btn_agreement2.bmp` `images\btn_agreement2.bmp`

File `/oname=$PLUGINSDIR\checkbox1.bmp` `images\checkbox1.bmp`

File `/oname=$PLUGINSDIR\checkbox2.bmp` `images\checkbox2.bmp`

;安装界面的图片

File `/oname=$PLUGINSDIR\installation.bmp` `images\installation.bmp`

File `/oname=$PLUGINSDIR\loading1.bmp` `images\loading1.bmp`

File `/oname=$PLUGINSDIR\loading2.bmp` `images\loading2.bmp`

#更改路径的界面

File `/oname=$PLUGINSDIR\btn_change.bmp` `images\btn_change.bmp`

#安装完成界面

File `/oname=$PLUGINSDIR\bg_finish.bmp` `images\bg_finish.bmp` ;安装完成的背景图片

File `/oname=$PLUGINSDIR\btn_complete.bmp` `images\btn_complete.bmp`

SkinBtn::Init "$PLUGINSDIR\btn_install.bmp"

SkinBtn::Init "$PLUGINSDIR\btn_close.bmp"

SkinBtn::Init "$PLUGINSDIR\btn_quit.bmp"

SkinBtn::Init "$PLUGINSDIR\btn_cancel.bmp"

SkinBtn::Init "$PLUGINSDIR\btn_agreement1.bmp"

SkinBtn::Init "$PLUGINSDIR\btn_agreement2.bmp"

SkinBtn::Init "$PLUGINSDIR\checkbox1.bmp"

SkinBtn::Init "$PLUGINSDIR\checkbox2.bmp"

SkinBtn::Init "$PLUGINSDIR\btn_change.bmp"

SkinBtn::Init "$PLUGINSDIR\btn_complete.bmp"

FunctionEnd

;初始化的函数

Function onGUIInit

;消除边框

System::Call `user32::SetWindowLong(i$HWNDPARENT,i${GWL_STYLE},0x9480084C)i.R0`

;隐藏一些既有控件

GetDlgItem $0 $HWNDPARENT 1034

ShowWindow $0 ${SW_HIDE}

GetDlgItem $0 $HWNDPARENT 1035

ShowWindow $0 ${SW_HIDE}

GetDlgItem $0 $HWNDPARENT 1036

ShowWindow $0 ${SW_HIDE}

GetDlgItem $0 $HWNDPARENT 1037

ShowWindow $0 ${SW_HIDE}

GetDlgItem $0 $HWNDPARENT 1038

ShowWindow $0 ${SW_HIDE}

GetDlgItem $0 $HWNDPARENT 1039

ShowWindow $0 ${SW_HIDE}

GetDlgItem $0 $HWNDPARENT 1256

ShowWindow $0 ${SW_HIDE}

GetDlgItem $0 $HWNDPARENT 1028

ShowWindow $0 ${SW_HIDE}

FunctionEnd

;处理无边框移动

Function onGUICallback

${If} $MSG = ${WM_LBUTTONDOWN}

SendMessage $HWNDPARENT ${WM_NCLBUTTONDOWN} ${HTCAPTION} $0

${EndIf}

FunctionEnd

Function onWarningGUICallback

${If} $MSG = ${WM_LBUTTONDOWN}

SendMessage $WarningForm ${WM_NCLBUTTONDOWN} ${HTCAPTION} $0

${EndIf}

FunctionEnd

;关闭函数

Function SkinBtn_Close

SkinBtn::Set /IMGID=$PLUGINSDIR\btn_close.bmp $1

FunctionEnd

;安装的函数

Function SkinBtn_Install

SkinBtn::Set /IMGID=$PLUGINSDIR\btn_install.bmp $1

FunctionEnd

;取消

Function SkinBtn_Cancel

SkinBtn::Set /IMGID=$PLUGINSDIR\btn_cancel.bmp $1

FunctionEnd

;退出

Function SkinBtn_Quit

SkinBtn::Set /IMGID=$PLUGINSDIR\btn_quit.bmp $1

FunctionEnd

;改变路径的按钮

Function SkinBtn_Modify

SkinBtn::Set /IMGID=$PLUGINSDIR\btn_agreement1.bmp $1

FunctionEnd

;checkBox

Function SkinBtn_Checked

SkinBtn::Set /IMGID=$PLUGINSDIR\checkbox2.bmp $1

FunctionEnd

Function SkinBtn_UnChecked

SkinBtn::Set /IMGID=$PLUGINSDIR\checkbox1.bmp $1

FunctionEnd

Function SkinBtn_HtmlLicense

SkinBtn::Set /IMGID=$PLUGINSDIR\btn_agreement2.bmp $1

FunctionEnd

#更改路径页面

;浏览按钮

Function SkinBtn_Browser

SkinBtn::Set /IMGID=$PLUGINSDIR\btn_change.bmp $1

FunctionEnd

;返回前一页的按钮

Function SkinBtn_BackPath

SkinBtn::Set /IMGID=$PLUGINSDIR\btn_agreement1.bmp $1

FunctionEnd

#安装完成页面

Function SkinBtn_Finish

SkinBtn::Set /IMGID=$PLUGINSDIR\btn_complete.bmp $1

FunctionEnd

############################################欢迎页面中的事件############################################

;点击许可协议的按钮

Function onClickHtmlLicense

;MessageBox MB_OK '两个都为空!'

ExecShell open "$PLUGINSDIR\License.html"

FunctionEnd

;点击checkBox同意协议与不同意协议时的处理事件

Function OnClick_CheckAgreeLicense

${IF} $Bool_AgreeLicense == 1

IntOp $Bool_AgreeLicense $Bool_AgreeLicense - 1

StrCpy $1 $Ck_AgreeLicense

Call SkinBtn_UnChecked

EnableWindow $Btn_Install 0 ;是否显示按钮

${ELSE}

IntOp $Bool_AgreeLicense $Bool_AgreeLicense + 1

StrCpy $1 $Ck_AgreeLicense

Call SkinBtn_Checked

EnableWindow $Btn_Install 1

${EndIf}

FunctionEnd

;点击修改路径按钮的事件,跳转到修改路径的页面

Function OnClick_Modify

StrCpy $R9 1 ;Goto the next page

;执行下一个页面

Call RelGotoPage

Abort ;修改的地方

FunctionEnd

;点击右上角关闭按钮

Function onClickClose

#关闭窗体的方法一:

FindProcDLL::FindProc "pkpm.exe"

Sleep 10

Pop $R0

${If} $R0 != 0

KillProcDLL::KillProc "pkpm.exe"

${EndIf}

#关闭窗体的方法二:

;SendMessage $hwndparent ${WM_CLOSE} 0 0

FunctionEnd

;点击关闭按钮响应的函数

Function onClose

Call onClickClose ;点击关闭响应的事件

FunctionEnd

############################################安装页面中的事件############################################

;安装界面的函数

Function NSD_TimerFun

GetFunctionAddress $0 NSD_TimerFun

nsDialogs::KillTimer $0

!if 1 ;是否在后台运行,1有效

GetFunctionAddress $0 DiskFrameWorkSpaceCheck

BgWorker::CallAndWait

!else

Call DiskFrameWorkSpaceCheck ;调用背景图片

!endif

FunctionEnd

;点击安装按钮的事件,进入到安装界面

Function OnClick_Install

StrCpy $R9 2 ;Goto the next page

;执行下一个页面

Call RelGotoPage

Abort

FunctionEnd

;跳转下一个页面的函数

Function RelGotoPage

IntCmp $R9 0 0 Move Move

StrCmp $R9 "X" 0 Move

StrCpy $R9 "120"

Move:

SendMessage $HWNDPARENT "0x408" "$R9" ""

FunctionEnd

#############################更改路径页面的事件###########################################

#磁盘检查

Function DiskFrameWorkSpaceCheck

StrCpy $2 $INSTDIR 3

${DriveSpace} "$2" "/D=F /S=M" $R0

ReadRegStr $8 HKLM 'Hardware\Description\System\CentralProcessor\0' Identifier

StrCpy $9 $8 3

${If} $9 == 'x86'

${If} $R0 < 90

MessageBox MB_ICONINFORMATION|MB_OK "安装空间不够"

Abort

;Call onClickClose ;点击关闭响应的事件

${EndIf}

${Else}

${If} $R0 < 610

MessageBox MB_ICONINFORMATION|MB_OK "安装空间不够"

;Call onClickClose ;点击关闭响应的事件

Abort

${EndIf}

${EndIf}

FunctionEnd

;主程序小于50mb判断

Function DiskProgramSpaceCheck

StrCpy $2 $INSTDIR 3

${DriveSpace} "$2" "/D=F /S=M" $R0

${If} $R0 < 10

MessageBox MB_ICONINFORMATION|MB_OK "主程序安装空间不够"

Abort

${EndIf}

FunctionEnd

;改变安装的路径

Function OnChange_DirRequest

${NSD_GetText} $Txt_Browser $6 ;获取控件文本状态,这里是指安装目录框的文字,也就是安装路径。

StrCpy $INSTDIR $6 ;将值赋予常量

${GetRoot} "$INSTDIR" $R3 ;获取安装根目录

StrCpy $R0 "$R3\"

StrCpy $R1 "invalid"

${GetDrives} "ALL" "HDDDetection" ;获取将要安装的根目录磁盘类型

FunctionEnd

Function HDDDetection

${if} $R0 == $9 ;$9是盘符;$8是属性

StrCpy $R1 $8

${endif}

Push $0

FunctionEnd

;点击浏览按钮的事件

Function OnClick_BrowseButton

Pop $0

Push $INSTDIR ; input string "C:\Program Files\ProgramName"

Call GetParent

Pop $R0 ; first part "C:\Program Files"

Push $INSTDIR ; input string "C:\Program Files\ProgramName"

Push "\" ; input chop char

Call GetLastPart

Pop $R1 ; last part "ProgramName"

nsDialogs::SelectFolderDialog "请选择 $R0 安装的文件夹:" "$R0"

Pop $0

${If} $0 == "error" # returns 'error' if 'cancel' was pressed?

Return

${EndIf}

${If} $0 != ""

StrCpy $INSTDIR "$0\$R1"

system::Call `user32::SetWindowText(i $Txt_Browser, t "$INSTDIR")`

${EndIf}

FunctionEnd

;得到选中目录用于拼接安装程序名称

Function GetParent

Exch $R0 ; input string

Push $R1

Push $R2

Push $R3

StrCpy $R1 0

StrLen $R2 $R0

loop:

IntOp $R1 $R1 + 1

IntCmp $R1 $R2 get 0 get

StrCpy $R3 $R0 1 -$R1

StrCmp $R3 "\" get

Goto loop

get:

StrCpy $R0 $R0 -$R1

Pop $R3

Pop $R2

Pop $R1

Exch $R0 ; output string

FunctionEnd

;截取选中目录

Function GetLastPart

Exch $0 ; chop char

Exch

Exch $1 ; input string

Push $2

Push $3

StrCpy $2 0

loop:

IntOp $2 $2 - 1

StrCpy $3 $1 1 $2

StrCmp $3 "" 0 +3

StrCpy $0 ""

Goto exit2

StrCmp $3 $0 exit1

Goto loop

exit1:

IntOp $2 $2 + 1

StrCpy $0 $1 "" $2

exit2:

Pop $3

Pop $2

Pop $1

Exch $0 ; output string

FunctionEnd

;跳转前一页面的事件

Function OnClick_BackPath

StrCpy $R9 -1 ;Goto the next page

;执行下一个页面

Call RelGotoPage

Abort

FunctionEnd

;执行安装界面的事件

Function OnClick_Install1

Call DiskFrameWorkSpaceCheck ;检查磁盘的空间

StrCpy $R9 1 ;Goto the next page

;执行下一个页面

Call RelGotoPage

Abort

FunctionEnd

#################################安装完成############################################

;点击checkBox桌面快捷方式的处理事件

Function OnClick_CheckDesktopShortCut

${IF} $Bool_DesktopShortCut == 1

IntOp $Bool_DesktopShortCut $Bool_DesktopShortCut - 1

StrCpy $1 $Ck_DesktopShortCut

Call SkinBtn_UnChecked

;EnableWindow $Btn_Install 0 ;是否显示按钮

${ELSE}

IntOp $Bool_DesktopShortCut $Bool_DesktopShortCut + 1

StrCpy $1 $Ck_DesktopShortCut

Call SkinBtn_Checked

;EnableWindow $Btn_Install 1

${EndIf}

FunctionEnd

;点击checkBox桌面任务栏快捷方式的处理事件

Function OnClick_taskbarpin

${IF} $Bool_taskbarpin == 1

IntOp $Bool_taskbarpin $Bool_taskbarpin - 1

StrCpy $1 $Ck_taskbarpin

Call SkinBtn_UnChecked

${ELSE}

IntOp $Bool_taskbarpin $Bool_taskbarpin + 1

StrCpy $1 $Ck_taskbarpin

Call SkinBtn_Checked

${EndIf}

FunctionEnd

Function OnClick_Finish

;当选择了生成快捷方式的combox的选择框时

${If} $Bool_taskbarpin == 1

${AndIf} $Bool_DesktopShortCut == 1

;生成桌面的快捷方式

CreateShortCut "$DESKTOP\Electron.lnk" "$INSTDIR\Electron.exe"

;生成任务栏的快捷方式

ExecShell "taskbarpin" "$DESKTOP\Electron.lnk"

${ElseIf} $Bool_taskbarpin == 1

;生成安装目录的快捷方式

CreateShortCut "$INSTDIR\Electron.lnk" "$INSTDIR\Electron.exe"

;创建任务栏快捷方式

ExecShell "taskbarpin" "$DESKTOP\Electron.lnk"

${ElseIf} $Bool_DesktopShortCut == 1

;生成桌面的快捷方式

CreateShortCut "$DESKTOP\Electron.lnk" "$INSTDIR\Electron.exe"

${Else}

${EndIf}

Call onClickClose ;点击关闭响应的事件

FunctionEnd

##################################################################################################################

#########################################自定义的欢迎页面#########################################################

##################################################################################################################

;自定义的欢迎页面 (如果此页面为空,则会调用原来的默认的页面)

Function WelcomePage

GetDlgItem $0 $HWNDPARENT 1

ShowWindow $0 ${SW_HIDE}

GetDlgItem $0 $HWNDPARENT 2

ShowWindow $0 ${SW_HIDE}

GetDlgItem $0 $HWNDPARENT 3

ShowWindow $0 ${SW_HIDE}

;初始化的定义一个窗口

nsDialogs::Create 1044

Pop $0

${If} $0 == error

Abort

${EndIf}

SetCtlColors $0 "" transparent ;背景设成透明

;加入头文件"nsWindows.nsh"

${NSW_SetWindowSize} $HWNDPARENT 508 296 ;改变窗体大小

${NSW_SetWindowSize} $0 508 296 ;改变Page大小

;关闭按钮

${NSD_CreateButton} 490 5 15 15 ""

Pop $Btn_Close

StrCpy $1 $Btn_Close

Call SkinBtn_Close

GetFunctionAddress $3 onClose

SkinBtn::onClick $1 $3

;立即安装的按钮

;${NSD_CreateButton} 240 260 88 25 ""

${NSD_CreateButton} 183 225 153 39 ""

Pop $Btn_Install

StrCpy $1 $Btn_Install

Call SkinBtn_Install

EnableWindow $Btn_Install 1

;定义的一个Bool值,用于是否显示

;StrCpy $Bool_Install 1

GetFunctionAddress $3 OnClick_Install

SkinBtn::onClick $1 $3

;右下方更改安装路径的控件使用

${NSD_CreateButton} 400 280 95 15 ""

Pop $Btn_LoadPath

StrCpy $1 $Btn_LoadPath

Call SkinBtn_Modify

GetFunctionAddress $3 OnClick_Modify

SkinBtn::onClick $1 $3

;CheckBox选中项

${NSD_CreateButton} 23 280 15 15 ""

Pop $Ck_AgreeLicense

StrCpy $1 $Ck_AgreeLicense

Call SkinBtn_Checked

GetFunctionAddress $3 OnClick_CheckAgreeLicense

SkinBtn::onClick $1 $3

StrCpy $Bool_AgreeLicense 1

${NSD_CreateLabel} 43 280 100 15 "我已阅读并同意"

Pop $Lbl_AgreeLicense

SetCtlColors $Lbl_AgreeLicense "" transparent ;背景设成透明

;checkBox按钮右侧的许可协议按钮,点击这个按钮可以打开html连接,显示网页的效果

${NSD_CreateButton} 130 280 100 15 ""

Pop $Btn_LoadPath

StrCpy $1 $Btn_LoadPath

Call SkinBtn_HtmlLicense

GetFunctionAddress $3 onClickHtmlLicense

SkinBtn::onClick $1 $3

;界面的上方图片

${NSD_CreateBitmap} 0 0 520 230 ""

Pop $TopImage

${NSD_SetImage} $TopImage $PLUGINSDIR\welcome.bmp $ImageHandle

;贴背景大图

${NSD_CreateBitmap} 0 0 100% 100% ""

Pop $BGImage

${NSD_SetImage} $BGImage $PLUGINSDIR\bg.bmp $ImageHandle

GetFunctionAddress $0 onGUICallback

WndProc::onCallback $BGImage $0 ;处理无边框窗体移动

nsDialogs::Show

${NSD_FreeImage} $ImageHandle

;当加上以下的代码后,背景图片以及界面的上方图片显示出来

GetFunctionAddress $0 onGUICallback

WndProc::onCallback $BGImage $0 ;处理无边框窗体移动

nsDialogs::Show

;释放背景图片的语句

${NSD_FreeImage} $ImageHandle

FunctionEnd

Function Callback

;Call OnCancelInstall

Pop $R8

Pop $R9

System::Int64Op $R8 * 100

Pop $R0

System::Int64Op $R0 / $R9

Pop $R3

SendMessage $8 ${PBM_SETPOS} $R3 0

${NSD_SetText} $9 "已经安装$R3%"

${if} $R8 = $R9

${NSD_SetText} $9 "安装完成"

#由于计算方式的四舍五入特性,进度条到安装完成时会有字节级别的误差,此处消除。

SendMessage $8 ${PBM_SETPOS} 100 0

System::Call "user32::InvalidateRect(i$hwndparent,i0,i 1)"

;MessageBox MB_OK "停止运行程序2!"

${endif}

FunctionEnd

Function .onRebootFailed

MessageBox MB_OK|MB_ICONSTOP "安装失败,请重新安装。" /SD IDOK

#当程序运行失败的时候,调用这个方法,删除生成的目录文件

Call OnCancelInstall

FunctionEnd

Function OnDialogTimer

${NSD_KillTimer} OnDialogTimer

SendMessage $8 ${PBM_SETRANGE32} 1 100 ;设置区间

GetFunctionAddress $0 Extractfunc

;MessageBox MB_OK "停止运行111111111111111111112!"

BgWorker::CallAndWait #启动一个低优先级的后台线程

;MessageBox MB_OK "停止运行111111111111111111111!"

FunctionEnd

Function Extractfunc

SetOutPath $INSTDIR

MessageBox MB_OK "$INSTDIR"

/*

该命令设置了由 File 命令使用的覆盖标记来决定目标文件已存在时是否覆盖。如果覆盖标记为 on,则目标文件被覆盖 (这个是默认值)。

如果覆盖标记为 off,则已存在的文件不会被覆盖。如果覆盖标记为 try,文件仅当可以被覆盖时 (就是说假如文件不能写入,它会自动略过而不需要用户决定) 才会覆盖目标文件。

如果覆盖标记为 ifnewer,则仅当已存在的文件比新文件旧时才会覆盖目标文件。如果覆盖标记为 ifdiff,则仅当已存在的文件比新文件旧或新时才会覆盖目标文件。

注意在 ifnewer 或 ifdiff 模式下,目标文件的日期都会被设为新文件的日期,而不管 SetDateSave 是怎么设置的。

*/

SetOverwrite ifnewer

File "Main.7z"

GetFunctionAddress $R9 Callback

MessageBox MB_OK "停止运行111111111111111111113!"

Nsis7z::ExtractWithCallback "Main.7z" $R9 ;必须使用这一句

/*

WriteUninstaller "$INSTDIR\uninst.exe" ;生成卸载exe,自动调用section Uninstall

WriteRegStr HKLM "$PRODUCT_INSTALL_KEY" "InstallDir" "$INSTDIR"

WriteRegStr HKLM "$PRODUCT_UNINST_KEY" "Version" "${PRODUCT_VERSION}"

;WriteRegStr HKLM "$PRODUCT_INSTALL_KEY" "Version" "$PRODUCT_VERSION_NAME"

WriteRegStr HKLM "$PRODUCT_UNINST_KEY" "DisplayName" "$(^Name)"

WriteRegStr HKLM "$PRODUCT_UNINST_KEY" "UninstallString" "$INSTDIR\uninst.exe"

WriteRegStr HKLM "$PRODUCT_UNINST_KEY" "DisplayIcon" "$INSTDIR\$PRODUCT_NAMEEXE"

WriteRegStr HKLM "$PRODUCT_UNINST_KEY" "DisplayVersion" "$PRODUCT_VERSION_NAME"

Delete "$OUTDIR\$PRODUCT_OUTFILE_MAIN7z"

*/

WriteUninstaller "$INSTDIR\uninst.exe" ;生成卸载exe,自动调用section Uninstall

WriteRegStr HKLM "${PRODUCT_INSTALL_KEY}" "Version" "${PRODUCT_VERSION}" ; 根键 子键 项 值

;MessageBox MB_OK "停止运行程序!"

#跳到下一个界面

StrCpy $R9 1 ;Goto the next page

Call RelGotoPage

;MessageBox MB_OK "停止运行程序1!"

FunctionEnd

##################################################################################################################

#########################################自定义的加载页面#########################################################555555555555555555555555555555555555555555555555555

##################################################################################################################

Function LoadingPage

GetDlgItem $0 $HWNDPARENT 1

ShowWindow $0 ${SW_HIDE}

GetDlgItem $0 $HWNDPARENT 2

ShowWindow $0 ${SW_HIDE}

GetDlgItem $0 $HWNDPARENT 3

ShowWindow $0 ${SW_HIDE}

nsDialogs::Create 1044

Pop $0

${If} $0 == error

Abort

${EndIf}

SetCtlColors $0 "" transparent ;背景设成透明

${NSW_SetWindowSize} $HWNDPARENT 509 330 ;改变自定义窗体大小

${NSW_SetWindowSize} $0 509 330 ;改变自定义Page大小

;创建背景图片的切换动态

System::Call `*(i,i,i,i)i(1,34,518,200).R0`

System::Call `user32::MapDialogRect(i$HWNDPARENT,iR0)`

System::Call `*$R0(i.s,i.s,i.s,i.s)`

System::Free $R0

FindWindow $R0 "#32770" "" $HWNDPARENT

System::Call `user32::CreateWindowEx(i,t"STATIC",in,i${DEFAULT_STYLES}|${SS_BLACKRECT},i1,i34,i518,i200,iR0,i1100,in,in)i.R0`

StrCpy $WebImg $R0

MessageBox MB_OK "确定安装?" #因为动态图片加载的过程中需要时间缓冲,因此加上这个进行缓冲处理

WebCtrl::ShowWebInCtrl $WebImg "$PLUGINSDIR/index.html"

;创建简要说明

Pop $0

${NSD_CreateLabel} 40 243 100 20 "开始安装..."

Pop $9

;进度条的创建

${NSD_CreateProgressBar} 24 265 460 20 ""

SkinProgress::Set $PB_ProgressBar "$PLUGINSDIR\loading2.bmp" "$PLUGINSDIR\loading1.bmp"

Pop $8

${NSD_CreateTimer} OnDialogTimer 100

;关闭按钮

${NSD_CreateButton} 490 5 15 15 ""

Pop $Btn_LoadingPage_Close

StrCpy $1 $Btn_LoadingPage_Close

Call SkinBtn_Close

EnableWindow $Btn_LoadingPage_Close 0

;贴背景大图

${NSD_CreateBitmap} 0 0 100% 100% ""

Pop $BGInstallImage

${NSD_SetImage} $BGInstallImage $PLUGINSDIR\bg.bmp $ImageHandle

GetFunctionAddress $0 onGUICallback

WndProc::onCallback $BGInstallImage $0 ;处理无边框窗体移动

nsDialogs::Show

${NSD_FreeImage} $ImageHandle

FunctionEnd

##################################################################################################################

#########################################自定义的修改路径页面#####################################################

##################################################################################################################

;修改安装路径的页面

Function PathPage

GetDlgItem $0 $HWNDPARENT 1

ShowWindow $0 ${SW_HIDE}

GetDlgItem $0 $HWNDPARENT 2

ShowWindow $0 ${SW_HIDE}

GetDlgItem $0 $HWNDPARENT 3

ShowWindow $0 ${SW_HIDE}

nsDialogs::Create 1044

Pop $0

${If} $0 == error

Abort

${EndIf}

SetCtlColors $0 "" transparent ;背景设成透明

${NSW_SetWindowSize} $HWNDPARENT 509 330 ;改变自定义窗体大小

${NSW_SetWindowSize} $0 509 330 ;改变自定义Page大小

;更改目录的文本框

${NSD_CreateDirRequest} 35 110 352 23 "$INSTDIR"

Pop $Txt_Browser

${NSD_OnChange} $Txt_Browser OnChange_DirRequest

;更改目录的按钮

${NSD_CreateBrowseButton} 401 110 76 23 ""

Pop $Btn_Browser

StrCpy $1 $Btn_Browser

Call SkinBtn_Browser

GetFunctionAddress $3 OnClick_BrowseButton

SkinBtn::onClick $1 $3

;左下角的返回按钮

${NSD_CreateButton} 24 294 95 15 ""

Pop $Btn_BackPath

StrCpy $1 $Btn_BackPath

Call SkinBtn_BackPath

GetFunctionAddress $3 OnClick_BackPath

SkinBtn::onClick $1 $3

;立即安装的按钮 首先判断是否同意安装,若不同意,此处的安装按钮便是灰色的,不可以点击;若同意,直接可以进行点击

${NSD_CreateButton} 187 228 153 39 ""

Pop $Btn_Install

StrCpy $1 $Btn_Install

Call SkinBtn_Install

${IF} $Bool_AgreeLicense == 0

EnableWindow $Btn_Install 0 ;否显示按钮

${ELSE}

EnableWindow $Btn_Install1 1

GetFunctionAddress $3 OnClick_Install1

SkinBtn::onClick $1 $3

${EndIf}

;关闭按钮

${NSD_CreateButton} 490 5 15 15 ""

Pop $Btn_PathPage_Close

StrCpy $1 $Btn_PathPage_Close

Call SkinBtn_Close

GetFunctionAddress $3 onClose

SkinBtn::onClick $1 $3

;贴背景大图

${NSD_CreateBitmap} 0 0 100% 100% ""

Pop $BGImage

${NSD_SetImage} $BGImage $PLUGINSDIR\bg.bmp $ImageHandle

GetFunctionAddress $0 onGUICallback

WndProc::onCallback $BGImage $0 ;处理无边框窗体移动

nsDialogs::Show

${NSD_FreeImage} $ImageHandle

FunctionEnd

##################################################################################################################

#########################################自定义的安装完成页面#####################################################

##################################################################################################################

Function FinishPage

GetDlgItem $0 $HWNDPARENT 1

ShowWindow $0 ${SW_HIDE}

GetDlgItem $0 $HWNDPARENT 2

ShowWindow $0 ${SW_HIDE}

GetDlgItem $0 $HWNDPARENT 3

ShowWindow $0 ${SW_HIDE}

nsDialogs::Create 1044

Pop $0

${If} $0 == error

Abort

${EndIf}

SetCtlColors $0 "" transparent ;背景设成透明

${NSW_SetWindowSize} $HWNDPARENT 509 330 ;改变自定义窗体大小

${NSW_SetWindowSize} $0 509 330 ;改变自定义Page大小

;关闭按钮

${NSD_CreateButton} 490 5 15 15 ""

Pop $Btn_FinishPage_Close

StrCpy $1 $Btn_FinishPage_Close

Call SkinBtn_Close

EnableWindow $Btn_FinishPage_Close 0

;界面的checkBox框(桌面快捷方式,任务栏快捷方式) taskbarpin ShortCut

${NSD_CreateButton} 202 120 15 15 ""

Pop $Ck_DesktopShortCut

StrCpy $1 $Ck_DesktopShortCut

Call SkinBtn_Checked

GetFunctionAddress $3 OnClick_CheckDesktopShortCut

SkinBtn::onClick $1 $3

StrCpy $Bool_DesktopShortCut 1

${NSD_CreateLabel} 222 120 100 15 "创建桌面快捷方式"

Pop $Lbl_DesktopShortCut

SetCtlColors $Lbl_DesktopShortCut "" transparent ;背景设成透明

${NSD_CreateButton} 202 162 15 15 ""

Pop $Ck_taskbarpin

StrCpy $1 $Ck_taskbarpin

Call SkinBtn_Checked

GetFunctionAddress $3 OnClick_taskbarpin

SkinBtn::onClick $1 $3

StrCpy $Bool_taskbarpin 1

${NSD_CreateLabel} 222 162 100 15 "创建任务栏快捷方式"

Pop $Lbl_taskbarpin

SetCtlColors $Lbl_taskbarpin "" transparent ;背景设成透明

;加载界面的完成按钮

${NSD_CreateButton} 183 236 150 38 ""

Pop $Btn_Finish

StrCpy $1 $Btn_Finish

Call SkinBtn_Finish

GetFunctionAddress $3 OnClick_Finish

SkinBtn::onClick $1 $3

;贴背景大图

${NSD_CreateBitmap} 0 0 100% 100% ""

Pop $Bg_FinishImage

${NSD_SetImage} $Bg_FinishImage $PLUGINSDIR\bg_finish.bmp $ImageHandle

GetFunctionAddress $0 onGUICallback

WndProc::onCallback $Bg_FinishImage $0 ;处理无边框窗体移动

nsDialogs::Show

${NSD_FreeImage} $ImageHandle

FunctionEnd

#当程序运行失败的时候,调用这个方法,删除生成的目录文件

Function OnCancelInstall

RMDir "$SMPROGRAMS\pkpm"

RMDir /r "$INSTDIR"

;关闭程序的事件

MessageBox MB_ICONSTOP "程序安装过程出现意外,请停止安装"

Call onClose

FunctionEnd

/******************************

* 以下是安装程序的卸载部分 *

******************************/

Section Uninstall

;删除任务栏快捷方式

ExecShell "taskbarunpin" "$DESKTOP\Electron.lnk"

;删除桌面的快捷方式

Delete "$DESKTOP\Electron.lnk"

Delete "$INSTDIR\uninst.exe" ; 删除自己

Delete "$SMPROGRAMS\pkpm\Uninstall.lnk"

RMDir "$SMPROGRAMS\pkpm"

;RMDir "$INSTDIR"

RMDir /r "$INSTDIR"

;DeleteRegKey HKLM "$PRODUCT_UNINST_KEY"

DeleteRegKey HKLM "${PRODUCT_INSTALL_KEY}"

SetAutoClose true

SectionEnd

#-- 根据 NSIS 脚本编辑规则,所有 Function 区段必须放置在 Section 区段之后编写,以避免安装程序出现未可预知的问题。--#

Function un.onInit

FindProcDLL::FindProc "Electron.exe"

Pop $R0

IntCmp $R0 1 0 no_run

MessageBox MB_ICONSTOP "安装程序检测到 Electron.exe 正在运行,请退出程序后重试"

Quit

no_run:

;Call IsProgramRunning #检测程序是否正在运行

MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "您确实要完全移除 $(^Name) ,及其所有的组件?" IDYES +2

Abort

FunctionEnd

Function un.onUninstSuccess

HideWindow

MessageBox MB_ICONINFORMATION|MB_OK "$(^Name) 已成功地从您的计算机移除。"

FunctionEnd
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: