杉宫竹苑工作室

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2102|回复: 0

NSIS 自定义安装部署实例

[复制链接]
发表于 2019-11-24 23:14:38 | 显示全部楼层 |阅读模式

正式会员享受无限制浏览网站功能和高速网盘下载,赶快加入本站吧!

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. ;安装目录
  2. Var LoadFileLabrary
  3. #自定义页面中的变量
  4. ;var txt_LicensePage
  5. ;界面上半部分的图片
  6. Var TopImage
  7. ;界面的背景图片
  8. Var BGImage
  9. Var ImageHandle
  10. ;界面上立即安装的按钮
  11. Var Btn_Install
  12. ;Var Bool_Install ;定义的一个Bool值,用于是否显示
  13. ;界面关闭按钮
  14. Var Btn_Close

  15. #安装路径的变量
  16. Var Btn_LoadPath
  17. ;创建checkBox
  18. Var Ck_AgreeLicense ;界面上同意协议check框
  19. Var Bool_AgreeLicense ;界面上同意协议check框的bool判定
  20. Var Lbl_AgreeLicense ;界面上同意协议lbl文字

  21. ;正在安装的界面
  22. #正在安装
  23. ;进度条变量
  24. Var PB_ProgressBar
  25. ;正在安装的变量
  26. var Lbl_Sumary
  27. ;网页控件
  28. Var WebImg
  29. ;背景图片
  30. Var BGInstallImage
  31. Var Btn_LoadingPage_Close ;关闭安装界面
  32. Var Lbl_ProgressPercent   ;1%
  33. Var ProgressPercent ;进度条中间值
  34. Var txt_ImgPage ;动态图片显示在txt框中

  35. #更改目录的界面
  36. ;文本框
  37. Var Txt_Browser
  38. ;按钮
  39. Var Btn_Browser
  40. ;返回前一页的按钮
  41. Var Btn_BackPath
  42. Var Btn_PathPage_Close ;关闭按钮

  43. #安装完成的界面
  44. Var Bg_FinishImage
  45. Var Btn_Finish ;完成的按钮
  46. Var Btn_FinishPage_Close ;关闭界面的按钮
  47. Var Lbl_DesktopShortCut  ;桌面的快捷方式文本
  48. Var Ck_DesktopShortCut   ;桌面的快捷方式checkbox
  49. Var Lbl_taskbarpin       ;任务栏的快捷方式文本
  50. Var Ck_taskbarpin        ;任务栏的快捷方式checkbox
  51. Var Bool_DesktopShortCut ;桌面的快捷方式的bool值判定
  52. Var Bool_taskbarpin      ;任务栏的快捷方式的bool值判定

  53. Var J3
  54. Var PRODUCT_NAME
  55. Var PRODUCT_NAMEEXE
  56. Var PRODUCT_INSTALL_KEY
  57. Var PRODUCT_UNINST_KEY
  58. Var PRODUCT_VERSION_NAME
  59. Var PRODUCT_VERSION_NO
  60. Var PRODUCT_OUTFILE_MAIN7z

  61. ; 该脚本使用 HM VNISEdit 脚本编辑器向导产生
  62. ; 安装程序初始定义常量
  63. !define PRODUCT_NAME "pkpm"
  64. !define PRODUCT_VERSION "1.0"
  65. !define PRODUCT_PUBLISHER "My company, Inc."
  66. !define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
  67. !define PRODUCT_INSTALL_KEY "Software\Microsoft\Windows\CurrentVersion\Install\${PRODUCT_NAME}"

  68. !define PRODUCT_UNINST_ROOT_KEY "HKLM"

  69. SetCompressor lzma
  70. ;BrandingText "${EM_BrandingText}"
  71. SetCompress force
  72. XPStyle on

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

  74. !include "MUI.nsh"
  75. !include "MUI2.nsh"
  76. !include "WinCore.nsh"
  77. ;引用文件函数头文件
  78. !include "FileFunc.nsh"
  79. !include "nsWindows.nsh"
  80. !include "LoadRTF.nsh"
  81. !include "WinMessages.nsh"
  82. ;循环语句需要的头文件操作
  83. !include "LogicLib.nsh"

  84. ; MUI 预定义常量
  85. !define MUI_ABORTWARNING
  86. ;安装图标的路径名字
  87. !define MUI_ICON "images\fav.ico"
  88. ;卸载图标的路径名字
  89. !define MUI_UNICON "images\fav.ico"

  90. ;自定义初始化
  91. !define MUI_CUSTOMFUNCTION_GUIINIT onGUIInit
  92. ;自定义欢迎页面
  93. Page custom WelcomePage
  94. ;自定义修改安装路径的页面
  95. Page custom PathPage
  96. ;自定义安装进度页面
  97. Page custom LoadingPage
  98. ;自定义安装完成页面
  99. Page custom FinishPage

  100. ; 欢迎页面
  101. !insertmacro MUI_PAGE_WELCOME
  102. ;许可协议页面
  103. !define MUI_LICENSEPAGE_CHECKBOX
  104. !insertmacro MUI_PAGE_LICENSE "aa.txt"
  105. ; 安装目录选择页面
  106. !insertmacro MUI_PAGE_DIRECTORY
  107. ; 安装过程页面
  108. !insertmacro MUI_PAGE_INSTFILES
  109. ; 安装完成页面
  110. !insertmacro MUI_PAGE_FINISH

  111. ; 安装卸载过程页面
  112. !insertmacro MUI_UNPAGE_INSTFILES
  113. ; 安装界面包含的语言设置
  114. !insertmacro MUI_LANGUAGE "SimpChinese"
  115. ; 安装预释放文件
  116. !insertmacro MUI_RESERVEFILE_INSTALLOPTIONS
  117. ; ------ MUI 现代界面定义结束 ------

  118. Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
  119. OutFile "pkpm.exe"
  120. ;InstallDir "$PROGRAMFILES\pkpm"
  121. ;InstallDir "$INSTDIR\pkpm"
  122. ShowInstDetails show
  123. ShowUnInstDetails show

  124. !define /math PBM_SETRANGE32 ${WM_USER} + 6 #定义nsis未包含的进度条相关常量
  125. #编写:水晶石
  126. InstallDir  "C:\pkpm"
  127. !define PRODUCT_OUTFILE_MAIN "Main.7z"   #对应主程序压缩包名称
  128. /*
  129. 该属性让安装程序去检测一注册表里的一个字串,
  130. 如果该字串可用那么把它用来作为安装目录。
  131. 如果预置了该属性,当指定的注册表键可用时它会越过 InstallDir 指定的字串,
  132. 否则使用默认的 InstallDir 指定值。查询注册表时,该命令将自动截去引号
  133. */
  134. ;!define PRODUCT_INSTALL_KEY "SOFTWARE\PKPM\Electron"
  135. ;InstallDirRegKey HKLM Software\NSIS "" 根键 子键 键名
  136. ;InstallDirRegKey HKLM "$PRODUCT_INSTALL_KEY" "C:\pkpm"

  137. Section MainSetup
  138. SectionEnd

  139. #检测程序是否正在运行
  140. Function IsProgramRunning
  141. FindProcDLL::FindProc "Electron.exe"
  142. Pop $R0
  143. IntCmp $R0 1 0 no_run
  144. MessageBox MB_ICONSTOP "安装程序检测到 Electron.exe 正在运行,请退出程序后重试"
  145. Quit
  146. no_run:
  147. FunctionEnd

  148. #检查程序的版本号
  149. Function CompareVersion
  150. ReadRegStr $0 HKLM ${PRODUCT_INSTALL_KEY} "Version"   ;PRODUCT_VERSION      ;用户变量(输出) 根键 子键 项
  151. ${IF} $0 != ""
  152. IntCmp ${PRODUCT_VERSION} $0 0 Old New
  153. MessageBox MB_YESNO  "安装程序检测到 $PRODUCT_NAME 已经安装,是否覆盖安装" IDYES Y IDNO N
  154. N:
  155. Quit
  156. Old:
  157. MessageBox MB_ICONSTOP "安装程序检测到 $PRODUCT_NAME 已经安装了更新版本"
  158. Quit
  159. New:
  160. MessageBox MB_ICONSTOP "安装程序检测到 $PRODUCT_NAME 已经安装了旧版本,继续更新安装"
  161. ${ENDIF}
  162. Y:
  163. FunctionEnd

  164. Function DefineReadINI
  165. SetOutPath $TEMP
  166. SetOverwrite on
  167. File "setup.ini"
  168. ReadINIStr $PRODUCT_NAME $TEMP\setup.ini SETUP_define PRODUCT_NAME
  169. ReadINIStr $PRODUCT_NAMEEXE $TEMP\setup.ini SETUP_define PRODUCT_NAMEEXE
  170. ReadINIStr $PRODUCT_INSTALL_KEY $TEMP\setup.ini SETUP_define PRODUCT_INSTALL_KEY
  171. ReadINIStr $PRODUCT_UNINST_KEY $TEMP\setup.ini SETUP_define PRODUCT_UNINST_KEY
  172. ReadINIStr $PRODUCT_VERSION_NAME $TEMP\setup.ini SETUP_define PRODUCT_VERSION_NAME
  173. ReadINIStr $PRODUCT_VERSION_NO $TEMP\setup.ini SETUP_define PRODUCT_VERSION_NO
  174. ReadINIStr $PRODUCT_OUTFILE_MAIN7z $TEMP\setup.ini SETUP_define PRODUCT_OUTFILE_MAIN7z
  175. FunctionEnd

  176. ;初始化必须要调用的组件
  177. Function .onInit
  178. InitPluginsDir
  179. Call IsProgramRunning   #检测程序是否正在运行
  180. Call CompareVersion     #检查程序的版本号

  181. ;显示动态的图片
  182. File `/oname=$PLUGINSDIR\index.html` `images\index.html`
  183. File `/oname=$PLUGINSDIR\loading_pic1.bmp` `images\loading_pic1.bmp`
  184. File `/oname=$PLUGINSDIR\loading_pic2.bmp` `images\loading_pic2.bmp`
  185. File `/oname=$PLUGINSDIR\loading_pic3.bmp` `images\loading_pic3.bmp`
  186. File `/oname=$PLUGINSDIR\loading_pic4.bmp` `images\loading_pic4.bmp`
  187. File `/oname=$PLUGINSDIR\license.rtf` `license\license.rtf`
  188. File `/oname=$PLUGINSDIR\License.html` `images\License.html`
  189. ;背景图片
  190. File `/ONAME=$PLUGINSDIR\bg.bmp` `images\bg.bmp`
  191. ;顶部图片
  192. File `/ONAME=$PLUGINSDIR\welcome.bmp` `images\welcome.bmp`
  193. File `/ONAME=$PLUGINSDIR\a.png` `images\a.png`
  194. ;关闭按钮
  195. File `/oname=$PLUGINSDIR\btn_close.bmp` `images\btn_close.bmp`
  196. ;立即安装的图片
  197. File `/oname=$PLUGINSDIR\btn_install.bmp` `images\btn_install.bmp`
  198. ;退出的背景图片
  199. File `/ONAME=$PLUGINSDIR\quit.bmp` `images\quit.bmp`
  200. ;改变路径的按钮图片
  201. File `/oname=$PLUGINSDIR\btn_agreement1.bmp` `images\btn_agreement1.bmp`
  202. File `/oname=$PLUGINSDIR\btn_agreement2.bmp` `images\btn_agreement2.bmp`
  203. File `/oname=$PLUGINSDIR\checkbox1.bmp` `images\checkbox1.bmp`
  204. File `/oname=$PLUGINSDIR\checkbox2.bmp` `images\checkbox2.bmp`
  205. ;安装界面的图片
  206. File `/oname=$PLUGINSDIR\installation.bmp` `images\installation.bmp`
  207. File `/oname=$PLUGINSDIR\loading1.bmp` `images\loading1.bmp`
  208. File `/oname=$PLUGINSDIR\loading2.bmp` `images\loading2.bmp`
  209. #更改路径的界面
  210. File `/oname=$PLUGINSDIR\btn_change.bmp` `images\btn_change.bmp`
  211. #安装完成界面
  212. File `/oname=$PLUGINSDIR\bg_finish.bmp` `images\bg_finish.bmp`  ;安装完成的背景图片
  213. File `/oname=$PLUGINSDIR\btn_complete.bmp` `images\btn_complete.bmp`

  214. SkinBtn::Init "$PLUGINSDIR\btn_install.bmp"
  215. SkinBtn::Init "$PLUGINSDIR\btn_close.bmp"
  216. SkinBtn::Init "$PLUGINSDIR\btn_quit.bmp"
  217. SkinBtn::Init "$PLUGINSDIR\btn_cancel.bmp"
  218. SkinBtn::Init "$PLUGINSDIR\btn_agreement1.bmp"
  219. SkinBtn::Init "$PLUGINSDIR\btn_agreement2.bmp"
  220. SkinBtn::Init "$PLUGINSDIR\checkbox1.bmp"
  221. SkinBtn::Init "$PLUGINSDIR\checkbox2.bmp"
  222. SkinBtn::Init "$PLUGINSDIR\btn_change.bmp"
  223. SkinBtn::Init "$PLUGINSDIR\btn_complete.bmp"

  224. FunctionEnd

  225. ;初始化的函数
  226. Function onGUIInit
  227. ;消除边框
  228. System::Call `user32::SetWindowLong(i$HWNDPARENT,i${GWL_STYLE},0x9480084C)i.R0`
  229. ;隐藏一些既有控件
  230. GetDlgItem $0 $HWNDPARENT 1034
  231. ShowWindow $0 ${SW_HIDE}
  232. GetDlgItem $0 $HWNDPARENT 1035
  233. ShowWindow $0 ${SW_HIDE}
  234. GetDlgItem $0 $HWNDPARENT 1036
  235. ShowWindow $0 ${SW_HIDE}
  236. GetDlgItem $0 $HWNDPARENT 1037
  237. ShowWindow $0 ${SW_HIDE}
  238. GetDlgItem $0 $HWNDPARENT 1038
  239. ShowWindow $0 ${SW_HIDE}
  240. GetDlgItem $0 $HWNDPARENT 1039
  241. ShowWindow $0 ${SW_HIDE}
  242. GetDlgItem $0 $HWNDPARENT 1256
  243. ShowWindow $0 ${SW_HIDE}
  244. GetDlgItem $0 $HWNDPARENT 1028
  245. ShowWindow $0 ${SW_HIDE}
  246. FunctionEnd

  247. ;处理无边框移动
  248. Function onGUICallback
  249. ${If} $MSG = ${WM_LBUTTONDOWN}
  250. SendMessage $HWNDPARENT ${WM_NCLBUTTONDOWN} ${HTCAPTION} $0
  251. ${EndIf}
  252. FunctionEnd

  253. Function onWarningGUICallback
  254. ${If} $MSG = ${WM_LBUTTONDOWN}
  255. SendMessage $WarningForm ${WM_NCLBUTTONDOWN} ${HTCAPTION} $0
  256. ${EndIf}
  257. FunctionEnd

  258. ;关闭函数
  259. Function SkinBtn_Close
  260. SkinBtn::Set /IMGID=$PLUGINSDIR\btn_close.bmp $1
  261. FunctionEnd

  262. ;安装的函数
  263. Function SkinBtn_Install
  264. SkinBtn::Set /IMGID=$PLUGINSDIR\btn_install.bmp $1
  265. FunctionEnd

  266. ;取消
  267. Function SkinBtn_Cancel
  268. SkinBtn::Set /IMGID=$PLUGINSDIR\btn_cancel.bmp $1
  269. FunctionEnd

  270. ;退出
  271. Function SkinBtn_Quit
  272. SkinBtn::Set /IMGID=$PLUGINSDIR\btn_quit.bmp $1
  273. FunctionEnd

  274. ;改变路径的按钮
  275. Function SkinBtn_Modify
  276. SkinBtn::Set /IMGID=$PLUGINSDIR\btn_agreement1.bmp $1
  277. FunctionEnd
  278. ;checkBox
  279. Function SkinBtn_Checked
  280. SkinBtn::Set /IMGID=$PLUGINSDIR\checkbox2.bmp $1
  281. FunctionEnd

  282. Function SkinBtn_UnChecked
  283. SkinBtn::Set /IMGID=$PLUGINSDIR\checkbox1.bmp $1
  284. FunctionEnd

  285. Function SkinBtn_HtmlLicense
  286. SkinBtn::Set /IMGID=$PLUGINSDIR\btn_agreement2.bmp $1
  287. FunctionEnd

  288. #更改路径页面
  289. ;浏览按钮
  290. Function SkinBtn_Browser
  291. SkinBtn::Set /IMGID=$PLUGINSDIR\btn_change.bmp $1
  292. FunctionEnd

  293. ;返回前一页的按钮
  294. Function SkinBtn_BackPath
  295. SkinBtn::Set /IMGID=$PLUGINSDIR\btn_agreement1.bmp $1
  296. FunctionEnd

  297. #安装完成页面
  298. Function SkinBtn_Finish
  299. SkinBtn::Set /IMGID=$PLUGINSDIR\btn_complete.bmp $1
  300. FunctionEnd

  301. ############################################欢迎页面中的事件############################################
  302. ;点击许可协议的按钮
  303. Function onClickHtmlLicense
  304. ;MessageBox MB_OK '两个都为空!'
  305. ExecShell open "$PLUGINSDIR\License.html"
  306. FunctionEnd

  307. ;点击checkBox同意协议与不同意协议时的处理事件
  308. Function OnClick_CheckAgreeLicense
  309. ${IF} $Bool_AgreeLicense == 1
  310. IntOp $Bool_AgreeLicense $Bool_AgreeLicense - 1
  311. StrCpy $1 $Ck_AgreeLicense
  312. Call SkinBtn_UnChecked
  313. EnableWindow $Btn_Install 0 ;是否显示按钮
  314. ${ELSE}
  315. IntOp $Bool_AgreeLicense $Bool_AgreeLicense + 1
  316. StrCpy $1 $Ck_AgreeLicense
  317. Call SkinBtn_Checked
  318. EnableWindow $Btn_Install 1
  319. ${EndIf}
  320. FunctionEnd

  321. ;点击修改路径按钮的事件,跳转到修改路径的页面
  322. Function OnClick_Modify
  323. StrCpy $R9 1 ;Goto the next page
  324. ;执行下一个页面
  325. Call RelGotoPage
  326. Abort   ;修改的地方
  327. FunctionEnd

  328. ;点击右上角关闭按钮
  329. Function onClickClose
  330. #关闭窗体的方法一:
  331. FindProcDLL::FindProc "pkpm.exe"
  332. Sleep 10
  333. Pop $R0
  334. ${If} $R0 != 0
  335. KillProcDLL::KillProc "pkpm.exe"
  336. ${EndIf}
  337. #关闭窗体的方法二:
  338. ;SendMessage $hwndparent ${WM_CLOSE} 0 0
  339. FunctionEnd

  340. ;点击关闭按钮响应的函数
  341. Function onClose
  342. Call onClickClose ;点击关闭响应的事件
  343. FunctionEnd

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

  345. ;安装界面的函数
  346. Function NSD_TimerFun
  347. GetFunctionAddress $0 NSD_TimerFun
  348. nsDialogs::KillTimer $0
  349. !if 1   ;是否在后台运行,1有效
  350. GetFunctionAddress $0 DiskFrameWorkSpaceCheck
  351. BgWorker::CallAndWait
  352. !else
  353. Call DiskFrameWorkSpaceCheck   ;调用背景图片
  354. !endif
  355. FunctionEnd

  356. ;点击安装按钮的事件,进入到安装界面
  357. Function OnClick_Install
  358. StrCpy $R9 2 ;Goto the next page
  359. ;执行下一个页面
  360. Call RelGotoPage
  361. Abort
  362. FunctionEnd

  363. ;跳转下一个页面的函数
  364. Function RelGotoPage
  365. IntCmp $R9 0 0 Move Move
  366. StrCmp $R9 "X" 0 Move
  367. StrCpy $R9 "120"
  368. Move:
  369. SendMessage $HWNDPARENT "0x408" "$R9" ""
  370. FunctionEnd

  371. #############################更改路径页面的事件###########################################
  372. #磁盘检查
  373. Function DiskFrameWorkSpaceCheck
  374. StrCpy $2 $INSTDIR 3
  375. ${DriveSpace}  "$2" "/D=F /S=M" $R0
  376. ReadRegStr $8 HKLM 'Hardware\Description\System\CentralProcessor\0' Identifier
  377. StrCpy $9 $8 3
  378. ${If} $9 == 'x86'
  379. ${If} $R0 < 90
  380. MessageBox MB_ICONINFORMATION|MB_OK "安装空间不够"
  381. Abort
  382. ;Call onClickClose ;点击关闭响应的事件
  383. ${EndIf}
  384. ${Else}
  385. ${If} $R0 < 610
  386. MessageBox MB_ICONINFORMATION|MB_OK "安装空间不够"
  387. ;Call onClickClose ;点击关闭响应的事件
  388. Abort
  389. ${EndIf}
  390. ${EndIf}
  391. FunctionEnd

  392. ;主程序小于50mb判断
  393. Function DiskProgramSpaceCheck
  394. StrCpy $2 $INSTDIR 3
  395. ${DriveSpace}  "$2" "/D=F /S=M" $R0
  396. ${If} $R0 < 10
  397. MessageBox MB_ICONINFORMATION|MB_OK "主程序安装空间不够"
  398. Abort
  399. ${EndIf}
  400. FunctionEnd

  401. ;改变安装的路径
  402. Function OnChange_DirRequest
  403. ${NSD_GetText} $Txt_Browser $6   ;获取控件文本状态,这里是指安装目录框的文字,也就是安装路径。
  404. StrCpy $INSTDIR $6  ;将值赋予常量
  405. ${GetRoot} "$INSTDIR" $R3   ;获取安装根目录
  406. StrCpy $R0 "$R3"
  407. StrCpy $R1 "invalid"
  408. ${GetDrives} "ALL" "HDDDetection"            ;获取将要安装的根目录磁盘类型
  409. FunctionEnd

  410. Function HDDDetection
  411. ${if} $R0 == $9    ;$9是盘符;$8是属性
  412. StrCpy $R1 $8
  413. ${endif}
  414. Push $0
  415. FunctionEnd

  416. ;点击浏览按钮的事件
  417. Function OnClick_BrowseButton
  418. Pop $0
  419. Push $INSTDIR ; input string "C:\Program Files\ProgramName"
  420. Call GetParent
  421. Pop $R0 ; first part "C:\Program Files"

  422. Push $INSTDIR ; input string "C:\Program Files\ProgramName"
  423. Push "" ; input chop char
  424. Call GetLastPart
  425. Pop $R1 ; last part "ProgramName"

  426. nsDialogs::SelectFolderDialog "请选择 $R0 安装的文件夹:" "$R0"
  427. Pop $0
  428. ${If} $0 == "error" # returns 'error' if 'cancel' was pressed?
  429. Return
  430. ${EndIf}
  431. ${If} $0 != ""
  432. StrCpy $INSTDIR "$0\$R1"
  433. system::Call `user32::SetWindowText(i $Txt_Browser, t "$INSTDIR")`
  434. ${EndIf}
  435. FunctionEnd

  436. ;得到选中目录用于拼接安装程序名称
  437. Function GetParent
  438. Exch $R0 ; input string
  439. Push $R1
  440. Push $R2
  441. Push $R3
  442. StrCpy $R1 0
  443. StrLen $R2 $R0
  444. loop:
  445. IntOp $R1 $R1 + 1
  446. IntCmp $R1 $R2 get 0 get
  447. StrCpy $R3 $R0 1 -$R1
  448. StrCmp $R3 "" get
  449. Goto loop
  450. get:
  451. StrCpy $R0 $R0 -$R1
  452. Pop $R3
  453. Pop $R2
  454. Pop $R1
  455. Exch $R0 ; output string
  456. FunctionEnd

  457. ;截取选中目录
  458. Function GetLastPart
  459. Exch $0 ; chop char
  460. Exch
  461. Exch $1 ; input string
  462. Push $2
  463. Push $3
  464. StrCpy $2 0
  465. loop:
  466. IntOp $2 $2 - 1
  467. StrCpy $3 $1 1 $2
  468. StrCmp $3 "" 0 +3
  469. StrCpy $0 ""
  470. Goto exit2
  471. StrCmp $3 $0 exit1
  472. Goto loop
  473. exit1:
  474. IntOp $2 $2 + 1
  475. StrCpy $0 $1 "" $2
  476. exit2:
  477. Pop $3
  478. Pop $2
  479. Pop $1
  480. Exch $0 ; output string
  481. FunctionEnd

  482. ;跳转前一页面的事件
  483. Function OnClick_BackPath
  484. StrCpy $R9 -1 ;Goto the next page
  485. ;执行下一个页面
  486. Call RelGotoPage
  487. Abort
  488. FunctionEnd

  489. ;执行安装界面的事件
  490. Function OnClick_Install1
  491. Call DiskFrameWorkSpaceCheck ;检查磁盘的空间
  492. StrCpy $R9 1 ;Goto the next page
  493. ;执行下一个页面
  494. Call RelGotoPage
  495. Abort
  496. FunctionEnd
  497. #################################安装完成############################################
  498. ;点击checkBox桌面快捷方式的处理事件
  499. Function OnClick_CheckDesktopShortCut
  500. ${IF} $Bool_DesktopShortCut == 1
  501. IntOp $Bool_DesktopShortCut $Bool_DesktopShortCut - 1
  502. StrCpy $1 $Ck_DesktopShortCut
  503. Call SkinBtn_UnChecked
  504. ;EnableWindow $Btn_Install 0 ;是否显示按钮
  505. ${ELSE}
  506. IntOp $Bool_DesktopShortCut $Bool_DesktopShortCut + 1
  507. StrCpy $1 $Ck_DesktopShortCut
  508. Call SkinBtn_Checked
  509. ;EnableWindow $Btn_Install 1
  510. ${EndIf}
  511. FunctionEnd

  512. ;点击checkBox桌面任务栏快捷方式的处理事件
  513. Function OnClick_taskbarpin
  514. ${IF} $Bool_taskbarpin == 1
  515. IntOp $Bool_taskbarpin $Bool_taskbarpin - 1
  516. StrCpy $1 $Ck_taskbarpin
  517. Call SkinBtn_UnChecked
  518. ${ELSE}
  519. IntOp $Bool_taskbarpin $Bool_taskbarpin + 1
  520. StrCpy $1 $Ck_taskbarpin
  521. Call SkinBtn_Checked
  522. ${EndIf}
  523. FunctionEnd

  524. Function OnClick_Finish
  525. ;当选择了生成快捷方式的combox的选择框时
  526. ${If} $Bool_taskbarpin == 1
  527. ${AndIf} $Bool_DesktopShortCut == 1
  528. ;生成桌面的快捷方式
  529. CreateShortCut "$DESKTOP\Electron.lnk" "$INSTDIR\Electron.exe"
  530. ;生成任务栏的快捷方式
  531. ExecShell "taskbarpin" "$DESKTOP\Electron.lnk"
  532. ${ElseIf} $Bool_taskbarpin == 1
  533. ;生成安装目录的快捷方式
  534. CreateShortCut "$INSTDIR\Electron.lnk" "$INSTDIR\Electron.exe"
  535. ;创建任务栏快捷方式
  536. ExecShell "taskbarpin" "$DESKTOP\Electron.lnk"
  537. ${ElseIf} $Bool_DesktopShortCut == 1
  538. ;生成桌面的快捷方式
  539. CreateShortCut "$DESKTOP\Electron.lnk" "$INSTDIR\Electron.exe"
  540. ${Else}
  541. ${EndIf}
  542. Call onClickClose ;点击关闭响应的事件
  543. FunctionEnd

  544. ##################################################################################################################
  545. #########################################自定义的欢迎页面#########################################################
  546. ##################################################################################################################

  547. ;自定义的欢迎页面 (如果此页面为空,则会调用原来的默认的页面)
  548. Function WelcomePage
  549. GetDlgItem $0 $HWNDPARENT 1
  550. ShowWindow $0 ${SW_HIDE}
  551. GetDlgItem $0 $HWNDPARENT 2
  552. ShowWindow $0 ${SW_HIDE}
  553. GetDlgItem $0 $HWNDPARENT 3
  554. ShowWindow $0 ${SW_HIDE}
  555. ;初始化的定义一个窗口
  556. nsDialogs::Create 1044
  557. Pop $0
  558. ${If} $0 == error
  559. Abort
  560. ${EndIf}
  561. SetCtlColors $0 ""  transparent ;背景设成透明
  562. ;加入头文件"nsWindows.nsh"
  563. ${NSW_SetWindowSize} $HWNDPARENT 508 296 ;改变窗体大小
  564. ${NSW_SetWindowSize} $0 508 296 ;改变Page大小

  565. ;关闭按钮
  566. ${NSD_CreateButton} 490 5 15 15 ""
  567. Pop $Btn_Close
  568. StrCpy $1 $Btn_Close
  569. Call SkinBtn_Close
  570. GetFunctionAddress $3 onClose
  571. SkinBtn::onClick $1 $3

  572. ;立即安装的按钮
  573. ;${NSD_CreateButton} 240 260 88 25 ""
  574. ${NSD_CreateButton} 183 225 153 39 ""
  575. Pop $Btn_Install
  576. StrCpy $1 $Btn_Install
  577. Call SkinBtn_Install
  578. EnableWindow $Btn_Install 1
  579. ;定义的一个Bool值,用于是否显示
  580. ;StrCpy $Bool_Install 1
  581. GetFunctionAddress $3 OnClick_Install
  582. SkinBtn::onClick $1 $3

  583. ;右下方更改安装路径的控件使用
  584. ${NSD_CreateButton} 400 280 95 15 ""
  585. Pop $Btn_LoadPath
  586. StrCpy $1 $Btn_LoadPath
  587. Call SkinBtn_Modify
  588. GetFunctionAddress $3 OnClick_Modify
  589. SkinBtn::onClick $1 $3

  590. ;CheckBox选中项
  591. ${NSD_CreateButton} 23 280 15 15 ""
  592. Pop $Ck_AgreeLicense
  593. StrCpy $1 $Ck_AgreeLicense
  594. Call SkinBtn_Checked
  595. GetFunctionAddress $3 OnClick_CheckAgreeLicense
  596. SkinBtn::onClick $1 $3
  597. StrCpy $Bool_AgreeLicense 1
  598. ${NSD_CreateLabel} 43 280 100 15 "我已阅读并同意"
  599. Pop $Lbl_AgreeLicense
  600. SetCtlColors $Lbl_AgreeLicense ""  transparent ;背景设成透明

  601. ;checkBox按钮右侧的许可协议按钮,点击这个按钮可以打开html连接,显示网页的效果
  602. ${NSD_CreateButton} 130 280 100 15 ""
  603. Pop $Btn_LoadPath
  604. StrCpy $1 $Btn_LoadPath
  605. Call SkinBtn_HtmlLicense
  606. GetFunctionAddress $3 onClickHtmlLicense
  607. SkinBtn::onClick $1 $3

  608. ;界面的上方图片
  609. ${NSD_CreateBitmap} 0 0 520 230 ""
  610. Pop $TopImage
  611. ${NSD_SetImage} $TopImage $PLUGINSDIR\welcome.bmp $ImageHandle

  612. ;贴背景大图
  613. ${NSD_CreateBitmap} 0 0 100% 100% ""
  614. Pop $BGImage
  615. ${NSD_SetImage} $BGImage $PLUGINSDIR\bg.bmp $ImageHandle

  616. GetFunctionAddress $0 onGUICallback
  617. WndProc::onCallback $BGImage $0 ;处理无边框窗体移动
  618. nsDialogs::Show
  619. ${NSD_FreeImage} $ImageHandle

  620. ;当加上以下的代码后,背景图片以及界面的上方图片显示出来
  621. GetFunctionAddress $0 onGUICallback
  622. WndProc::onCallback $BGImage $0 ;处理无边框窗体移动
  623. nsDialogs::Show
  624. ;释放背景图片的语句
  625. ${NSD_FreeImage} $ImageHandle
  626. FunctionEnd

  627. Function Callback
  628. ;Call OnCancelInstall
  629. Pop $R8
  630. Pop $R9
  631. System::Int64Op $R8 * 100
  632. Pop $R0
  633. System::Int64Op $R0 / $R9
  634. Pop $R3
  635. SendMessage $8 ${PBM_SETPOS} $R3 0
  636. ${NSD_SetText} $9 "已经安装$R3%"
  637. ${if} $R8 = $R9
  638. ${NSD_SetText} $9 "安装完成"
  639. #由于计算方式的四舍五入特性,进度条到安装完成时会有字节级别的误差,此处消除。
  640. SendMessage $8 ${PBM_SETPOS} 100 0
  641. System::Call "user32::InvalidateRect(i$hwndparent,i0,i 1)"
  642. ;MessageBox MB_OK "停止运行程序2!"
  643. ${endif}
  644. FunctionEnd

  645. Function .onRebootFailed
  646. MessageBox MB_OK|MB_ICONSTOP "安装失败,请重新安装。" /SD IDOK
  647. #当程序运行失败的时候,调用这个方法,删除生成的目录文件
  648. Call OnCancelInstall
  649. FunctionEnd

  650. Function OnDialogTimer
  651. ${NSD_KillTimer} OnDialogTimer
  652. SendMessage $8 ${PBM_SETRANGE32} 1 100      ;设置区间
  653. GetFunctionAddress $0 Extractfunc
  654. ;MessageBox MB_OK "停止运行111111111111111111112!"
  655. BgWorker::CallAndWait #启动一个低优先级的后台线程
  656. ;MessageBox MB_OK "停止运行111111111111111111111!"
  657. FunctionEnd

  658. Function Extractfunc
  659. SetOutPath $INSTDIR
  660. MessageBox MB_OK "$INSTDIR"
  661. /*
  662. 该命令设置了由 File 命令使用的覆盖标记来决定目标文件已存在时是否覆盖。如果覆盖标记为 on,则目标文件被覆盖 (这个是默认值)。
  663. 如果覆盖标记为 off,则已存在的文件不会被覆盖。如果覆盖标记为 try,文件仅当可以被覆盖时 (就是说假如文件不能写入,它会自动略过而不需要用户决定) 才会覆盖目标文件。
  664. 如果覆盖标记为 ifnewer,则仅当已存在的文件比新文件旧时才会覆盖目标文件。如果覆盖标记为 ifdiff,则仅当已存在的文件比新文件旧或新时才会覆盖目标文件。
  665. 注意在 ifnewer 或 ifdiff 模式下,目标文件的日期都会被设为新文件的日期,而不管 SetDateSave 是怎么设置的。
  666. */
  667. SetOverwrite ifnewer
  668. File "Main.7z"
  669. GetFunctionAddress $R9 Callback
  670. MessageBox MB_OK "停止运行111111111111111111113!"
  671. Nsis7z::ExtractWithCallback  "Main.7z" $R9  ;必须使用这一句
  672. /*
  673. WriteUninstaller "$INSTDIR\uninst.exe"  ;生成卸载exe,自动调用section Uninstall
  674. WriteRegStr HKLM "$PRODUCT_INSTALL_KEY" "InstallDir" "$INSTDIR"
  675. WriteRegStr HKLM "$PRODUCT_UNINST_KEY" "Version" "${PRODUCT_VERSION}"
  676. ;WriteRegStr HKLM "$PRODUCT_INSTALL_KEY" "Version" "$PRODUCT_VERSION_NAME"
  677. WriteRegStr HKLM "$PRODUCT_UNINST_KEY" "DisplayName" "$(^Name)"
  678. WriteRegStr HKLM "$PRODUCT_UNINST_KEY" "UninstallString" "$INSTDIR\uninst.exe"
  679. WriteRegStr HKLM "$PRODUCT_UNINST_KEY" "DisplayIcon" "$INSTDIR\$PRODUCT_NAMEEXE"
  680. WriteRegStr HKLM "$PRODUCT_UNINST_KEY" "DisplayVersion" "$PRODUCT_VERSION_NAME"
  681. Delete "$OUTDIR\$PRODUCT_OUTFILE_MAIN7z"
  682. */
  683. WriteUninstaller "$INSTDIR\uninst.exe"  ;生成卸载exe,自动调用section Uninstall
  684. WriteRegStr HKLM "${PRODUCT_INSTALL_KEY}" "Version" "${PRODUCT_VERSION}"   ; 根键 子键 项 值

  685. ;MessageBox MB_OK "停止运行程序!"
  686. #跳到下一个界面
  687. StrCpy $R9 1 ;Goto the next page
  688. Call RelGotoPage

  689. ;MessageBox MB_OK "停止运行程序1!"
  690. FunctionEnd

  691. ##################################################################################################################
  692. #########################################自定义的加载页面#########################################################555555555555555555555555555555555555555555555555555
  693. ##################################################################################################################
  694. Function LoadingPage
  695. GetDlgItem $0 $HWNDPARENT 1
  696. ShowWindow $0 ${SW_HIDE}
  697. GetDlgItem $0 $HWNDPARENT 2
  698. ShowWindow $0 ${SW_HIDE}
  699. GetDlgItem $0 $HWNDPARENT 3
  700. ShowWindow $0 ${SW_HIDE}

  701. nsDialogs::Create 1044
  702. Pop $0
  703. ${If} $0 == error
  704. Abort
  705. ${EndIf}
  706. SetCtlColors $0 ""  transparent ;背景设成透明
  707. ${NSW_SetWindowSize} $HWNDPARENT 509 330 ;改变自定义窗体大小
  708. ${NSW_SetWindowSize} $0 509 330 ;改变自定义Page大小

  709. ;创建背景图片的切换动态
  710. System::Call `*(i,i,i,i)i(1,34,518,200).R0`
  711. System::Call `user32::MapDialogRect(i$HWNDPARENT,iR0)`
  712. System::Call `*$R0(i.s,i.s,i.s,i.s)`
  713. System::Free $R0
  714. FindWindow $R0 "#32770" "" $HWNDPARENT
  715. System::Call `user32::CreateWindowEx(i,t"STATIC",in,i${DEFAULT_STYLES}|${SS_BLACKRECT},i1,i34,i518,i200,iR0,i1100,in,in)i.R0`
  716. StrCpy $WebImg $R0
  717. MessageBox MB_OK "确定安装?"  #因为动态图片加载的过程中需要时间缓冲,因此加上这个进行缓冲处理
  718. WebCtrl::ShowWebInCtrl $WebImg "$PLUGINSDIR/index.html"

  719. ;创建简要说明
  720. Pop $0
  721. ${NSD_CreateLabel} 40 243 100 20 "开始安装..."
  722. Pop $9

  723. ;进度条的创建
  724. ${NSD_CreateProgressBar} 24 265 460 20 ""
  725. SkinProgress::Set $PB_ProgressBar "$PLUGINSDIR\loading2.bmp" "$PLUGINSDIR\loading1.bmp"
  726. Pop $8
  727. ${NSD_CreateTimer} OnDialogTimer  100

  728. ;关闭按钮
  729. ${NSD_CreateButton} 490 5 15 15 ""
  730. Pop $Btn_LoadingPage_Close
  731. StrCpy $1 $Btn_LoadingPage_Close
  732. Call SkinBtn_Close
  733. EnableWindow $Btn_LoadingPage_Close 0

  734. ;贴背景大图
  735. ${NSD_CreateBitmap} 0 0 100% 100% ""
  736. Pop $BGInstallImage
  737. ${NSD_SetImage} $BGInstallImage $PLUGINSDIR\bg.bmp $ImageHandle

  738. GetFunctionAddress $0 onGUICallback
  739. WndProc::onCallback $BGInstallImage $0 ;处理无边框窗体移动
  740. nsDialogs::Show
  741. ${NSD_FreeImage} $ImageHandle
  742. FunctionEnd
  743. ##################################################################################################################
  744. #########################################自定义的修改路径页面#####################################################
  745. ##################################################################################################################
  746. ;修改安装路径的页面
  747. Function PathPage
  748. GetDlgItem $0 $HWNDPARENT 1
  749. ShowWindow $0 ${SW_HIDE}
  750. GetDlgItem $0 $HWNDPARENT 2
  751. ShowWindow $0 ${SW_HIDE}
  752. GetDlgItem $0 $HWNDPARENT 3
  753. ShowWindow $0 ${SW_HIDE}
  754. nsDialogs::Create 1044
  755. Pop $0
  756. ${If} $0 == error
  757. Abort
  758. ${EndIf}
  759. SetCtlColors $0 ""  transparent ;背景设成透明

  760. ${NSW_SetWindowSize} $HWNDPARENT 509 330 ;改变自定义窗体大小
  761. ${NSW_SetWindowSize} $0 509 330 ;改变自定义Page大小

  762. ;更改目录的文本框
  763. ${NSD_CreateDirRequest} 35 110 352 23 "$INSTDIR"
  764. Pop $Txt_Browser
  765. ${NSD_OnChange} $Txt_Browser OnChange_DirRequest

  766. ;更改目录的按钮
  767. ${NSD_CreateBrowseButton} 401 110 76 23 ""
  768. Pop $Btn_Browser
  769. StrCpy $1 $Btn_Browser
  770. Call SkinBtn_Browser
  771. GetFunctionAddress $3 OnClick_BrowseButton
  772. SkinBtn::onClick $1 $3

  773. ;左下角的返回按钮
  774. ${NSD_CreateButton} 24 294 95 15 ""
  775. Pop $Btn_BackPath
  776. StrCpy $1 $Btn_BackPath
  777. Call SkinBtn_BackPath
  778. GetFunctionAddress $3 OnClick_BackPath
  779. SkinBtn::onClick $1 $3

  780. ;立即安装的按钮  首先判断是否同意安装,若不同意,此处的安装按钮便是灰色的,不可以点击;若同意,直接可以进行点击
  781. ${NSD_CreateButton} 187 228 153 39 ""
  782. Pop $Btn_Install
  783. StrCpy $1 $Btn_Install
  784. Call SkinBtn_Install
  785. ${IF} $Bool_AgreeLicense == 0
  786. EnableWindow $Btn_Install 0 ;否显示按钮
  787. ${ELSE}
  788. EnableWindow $Btn_Install1 1
  789. GetFunctionAddress $3 OnClick_Install1
  790. SkinBtn::onClick $1 $3
  791. ${EndIf}
  792. ;关闭按钮
  793. ${NSD_CreateButton} 490 5 15 15 ""
  794. Pop $Btn_PathPage_Close
  795. StrCpy $1 $Btn_PathPage_Close
  796. Call SkinBtn_Close
  797. GetFunctionAddress $3 onClose
  798. SkinBtn::onClick $1 $3

  799. ;贴背景大图
  800. ${NSD_CreateBitmap} 0 0 100% 100% ""
  801. Pop $BGImage
  802. ${NSD_SetImage} $BGImage $PLUGINSDIR\bg.bmp $ImageHandle

  803. GetFunctionAddress $0 onGUICallback
  804. WndProc::onCallback $BGImage $0 ;处理无边框窗体移动
  805. nsDialogs::Show
  806. ${NSD_FreeImage} $ImageHandle
  807. FunctionEnd

  808. ##################################################################################################################
  809. #########################################自定义的安装完成页面#####################################################
  810. ##################################################################################################################
  811. Function FinishPage
  812. GetDlgItem $0 $HWNDPARENT 1
  813. ShowWindow $0 ${SW_HIDE}
  814. GetDlgItem $0 $HWNDPARENT 2
  815. ShowWindow $0 ${SW_HIDE}
  816. GetDlgItem $0 $HWNDPARENT 3
  817. ShowWindow $0 ${SW_HIDE}
  818. nsDialogs::Create 1044
  819. Pop $0
  820. ${If} $0 == error
  821. Abort
  822. ${EndIf}
  823. SetCtlColors $0 ""  transparent ;背景设成透明
  824. ${NSW_SetWindowSize} $HWNDPARENT 509 330 ;改变自定义窗体大小
  825. ${NSW_SetWindowSize} $0 509 330 ;改变自定义Page大小

  826. ;关闭按钮
  827. ${NSD_CreateButton} 490  5 15 15 ""
  828. Pop $Btn_FinishPage_Close
  829. StrCpy $1 $Btn_FinishPage_Close
  830. Call SkinBtn_Close
  831. EnableWindow $Btn_FinishPage_Close 0
  832. ;界面的checkBox框(桌面快捷方式,任务栏快捷方式) taskbarpin   ShortCut
  833. ${NSD_CreateButton} 202 120 15 15 ""
  834. Pop $Ck_DesktopShortCut
  835. StrCpy $1 $Ck_DesktopShortCut
  836. Call SkinBtn_Checked
  837. GetFunctionAddress $3 OnClick_CheckDesktopShortCut
  838. SkinBtn::onClick $1 $3
  839. StrCpy $Bool_DesktopShortCut 1
  840. ${NSD_CreateLabel} 222 120 100 15 "创建桌面快捷方式"
  841. Pop $Lbl_DesktopShortCut
  842. SetCtlColors $Lbl_DesktopShortCut "" transparent ;背景设成透明

  843. ${NSD_CreateButton} 202 162 15 15 ""
  844. Pop $Ck_taskbarpin
  845. StrCpy $1 $Ck_taskbarpin
  846. Call SkinBtn_Checked
  847. GetFunctionAddress $3 OnClick_taskbarpin
  848. SkinBtn::onClick $1 $3
  849. StrCpy $Bool_taskbarpin 1
  850. ${NSD_CreateLabel} 222 162 100 15 "创建任务栏快捷方式"
  851. Pop $Lbl_taskbarpin
  852. SetCtlColors $Lbl_taskbarpin "" transparent ;背景设成透明

  853. ;加载界面的完成按钮
  854. ${NSD_CreateButton} 183 236 150 38 ""
  855. Pop $Btn_Finish
  856. StrCpy $1 $Btn_Finish
  857. Call SkinBtn_Finish
  858. GetFunctionAddress $3 OnClick_Finish
  859. SkinBtn::onClick $1 $3

  860. ;贴背景大图
  861. ${NSD_CreateBitmap} 0 0 100% 100% ""
  862. Pop $Bg_FinishImage
  863. ${NSD_SetImage} $Bg_FinishImage $PLUGINSDIR\bg_finish.bmp $ImageHandle
  864. GetFunctionAddress $0 onGUICallback
  865. WndProc::onCallback $Bg_FinishImage $0 ;处理无边框窗体移动
  866. nsDialogs::Show
  867. ${NSD_FreeImage} $ImageHandle
  868. FunctionEnd

  869. #当程序运行失败的时候,调用这个方法,删除生成的目录文件
  870. Function OnCancelInstall
  871. RMDir "$SMPROGRAMS\pkpm"
  872. RMDir /r "$INSTDIR"
  873. ;关闭程序的事件
  874. MessageBox MB_ICONSTOP "程序安装过程出现意外,请停止安装"
  875. Call onClose
  876. FunctionEnd

  877. /******************************
  878. *  以下是安装程序的卸载部分  *
  879. ******************************/

  880. Section Uninstall
  881. ;删除任务栏快捷方式
  882. ExecShell "taskbarunpin" "$DESKTOP\Electron.lnk"
  883. ;删除桌面的快捷方式
  884. Delete "$DESKTOP\Electron.lnk"
  885. Delete "$INSTDIR\uninst.exe"   ; 删除自己
  886. Delete "$SMPROGRAMS\pkpm\Uninstall.lnk"
  887. RMDir "$SMPROGRAMS\pkpm"
  888. ;RMDir "$INSTDIR"
  889. RMDir /r "$INSTDIR"
  890. ;DeleteRegKey HKLM "$PRODUCT_UNINST_KEY"
  891. DeleteRegKey HKLM "${PRODUCT_INSTALL_KEY}"
  892. SetAutoClose true
  893. SectionEnd

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

  896. FindProcDLL::FindProc "Electron.exe"
  897. Pop $R0
  898. IntCmp $R0 1 0 no_run
  899. MessageBox MB_ICONSTOP "安装程序检测到 Electron.exe 正在运行,请退出程序后重试"
  900. Quit
  901. no_run:

  902. ;Call IsProgramRunning   #检测程序是否正在运行
  903. MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "您确实要完全移除 $(^Name) ,及其所有的组件?" IDYES +2
  904. Abort

  905. FunctionEnd

  906. Function un.onUninstSuccess
  907. HideWindow
  908. MessageBox MB_ICONINFORMATION|MB_OK "$(^Name) 已成功地从您的计算机移除。"
  909. FunctionEnd

复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SgzyStudio

GMT+8, 2024-4-30 12:24 , Processed in 0.108155 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表