友情提醒:随着7zip版本快速更新,nsis7z插件已经不能全面兼容新版,使用本例子请将7zip版本降至9.2x以下并下载最新版nsis7z.dll!

----------------------------------------------------------------------------------------------------------------

几乎所有玩过nsis的人在制作安装进度页面时都会遇到一个比较棘手的问题,画出进度条容易,但准确掌握文件释放进度,同时再去配合进度条的进度在nsis看来几乎是个无法逾越的障碍,因为迄今为止NSIS尚无可直接使用的指令或者函数来获取相关数据。网络上解决这个问题大部分做法都是大约分为若干段,20%...40%...80%...100%这样大概做个进度的样子,其实与释放的文件几乎没什么联系,并且误差非常大,我这个办法可以尽最大可能的让进度条进度与文件释放进度相匹配,脚本里面使用到两个nsis插件:

官方下载:

NSIS7Z plug-in

http://nsis.sourceforge.net/Nsis7z_plug-in

BgWorker plug-in

http://nsis.sourceforge.net/BgWorker_plug-in

将你要封装的文件按照部署的结构用7zip压缩备用

原理:自定义界面设置计数器启动后台线程,然后获取7z插件的回调函数数据。

封装脚本:

Outfile "customProgressBar.exe"

!include nsDialogs.nsh
!define /math PBM_SETRANGE32 ${WM_USER} + 6 #定义nsis未包含的进度条相关常量
#编写:水晶石
InstallDir "C:\test"
page custom custompage

Function custompage
nsDialogs::Create 1018
  Pop $0
  ${NSD_CreateLabel} 100 100 100% 30u "开始安装..."
  Pop $9
  SetCtlColors $9  0x000000 0xECE9D8
  ${NSD_CreateProgressBar} 0 50 100% 20 ""
  Pop $8
  ${NSD_CreateTimer} OnDialogTimer 50 
nsDialogs::Show
FunctionEnd

Function OnDialogTimer
  ${NSD_KillTimer} OnDialogTimer
  SendMessage $8 ${PBM_SETRANGE32} 1 100
  GetFunctionAddress $0 Extractfunc
  BgWorker::CallAndWait #启动一个低优先级的后台线程
FunctionEnd

Function Extractfunc
  SetOutPath $INSTDIR
  File "test.7z"
  GetFunctionAddress $R9 Callback
  Nsis7z::ExtractWithCallback "test.7z" $R9
  Delete "$OUTDIR\test.7z"
FunctionEnd

Function Callback
  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)"
  ${endif}
FunctionEnd

Section
DetailPrint "..."
SectionEnd

最新文章

  1. React Diff算法
  2. 令人崩溃的@requestBody乱码一例
  3. 获得Window窗口权限的三种方法
  4. 查询局域网内在线电脑IP
  5. user database的initial size和dbcc shrinkfile
  6. 【转】如何使用KeyChain保存和获取UDID
  7. Smarty模板引擎技术
  8. enum flags 枚举Flags标示 位运算符
  9. 如何设置MySQL数据库名、表名大小写敏感
  10. Python 特殊方法
  11. JAVA_Class.forName()用法详解
  12. 【.net】未能加载文件或程序集“System.Web.Mvc, Version=5.2.2.0
  13. Xdebug调试环境配置
  14. (java项目)坦克大战 2.0
  15. windows2003服务器,时间每隔1小时自动同步一次
  16. moand的编程学形式:一个(高阶)类型包办程序的组织--类型关乎复合
  17. 算法笔记_198:历届试题 打印十字图(Java)
  18. sqlserver中的全局变量总结
  19. [svc]磁盘接口与RAID
  20. webpack4.x最详细入门讲解

热门文章

  1. Hippo4J v1.3.1 发布,增加 Netty 监控上报、SpringCloud Hystrix 线程池监控等特性
  2. 记vs2019 The view 'xxx' was not found.
  3. css基础02
  4. mysql grant命令
  5. Odoo14 TypeError: Cannot read property 'classList' of undefined
  6. 万答#1,MySQL中如何查询某个表上的IS(意向共享)锁
  7. vue2自定义指令-加载指令v-loading和占位图指令v-showimg
  8. React报错之useNavigate() may be used only in context of Router
  9. Linux 08 磁盘管理
  10. Java多线程开发系列之五:Springboot 中异步请求方法的使用