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
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
相关文章推荐
- 在 cocos2d-x 中使用 libcurl 实现上传文件功能(附quick-cocos2d-x封装)
- 【Android应用开发技术:用户界面】9Patch图片设计
- java内存优化实践
- 硬盘直读
- 一步一步实现500px引导动画 -- 酷酷哒
- windows7下的iis配置asp.net本地网站
- 青蛙跳台阶
- github优秀开源项目大全-iOS
- all about AIX MPIO
- Android笔记:获取屏幕信息
- 时间格式设置
- java实现赫夫曼树
- 新建class 关联不到source folder
- visual studio设置为使用IIS运行网站时加载项目遇到权限问题的解决方法
- JSON jar包版本问题
- linux awk命令详解
- 操作系统原理——系统进程简析
- jvm内存优化
- C# in depth (第七章 最后的一些特性)
- 解决win10启动提示页面文件配置问题的故障