NSIS 自定义安装部署实例

;安装目录
 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
© 版权声明
THE END
喜欢就支持一下吧
点赞7 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容