友情提醒:随着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

NSIS 自定义安装界面准确获取安装进度完美解决方案的更多相关文章

  1. WinForm程序界面假死,寻求完美解决方案

    故事的开端是这样的,小白是一个程序员,他确实也是一个小白,目前还在程序员发展的道路上,兢兢业业的小心求学. 有一天,小白接到一个任务,完成一个Winform程序,附加一个功能就是可以读IC卡. 小白终 ...

  2. zz Windows 10安装教程:硬盘安装Win10 系统步骤(适合32位和64位)

    Windows 10安装教程:硬盘安装Win10 系统步骤(适合32位和64位) Posted on 2015年01月28日 by 虾虾 22 Comments   最新的Windows 10 MSD ...

  3. 以前编写的inno setup脚本,涵盖了自定义安装界面,调用dll等等应用 (转)

    以前编写的inno setup脚本,涵盖了自定义安装界面,调用dll等等应用 (转) ; Script generated by the Inno Setup 脚本向导. ; SEE THE DOCU ...

  4. NSIS自定义目录选择页面制作之安装…

    在nsis制作自定义界面中,目录选择页面个人感觉最为繁琐,因为该界面不仅涉及到界面控件的创建,还要涉及到控件消息传递和状态改变时的回调函数通告. 迅雷界面为例: 其中安装目录中的8盘符,在本机中并不存 ...

  5. Wix 安装部署教程(三)自定义安装界面和行为

    接上一篇自定义安装界面,这篇继续探索,首先介绍下,Wix为我们定义了五种风格,每种风格的UI都是有一定顺序的.我们可以改变安装顺序,也可以完全自定义一个Dialog插入其中.比如Wix_Mondo 风 ...

  6. WPF好看的进度条实现浅谈(效果有点类似VS2012安装界面)

    为了界面友好,一般的操作时间较长时,都需要增加进度条提示.由于WPF自带的进度条其实不怎么好看,而且没啥视觉效果.后来,装VS2012时,发现安装过程中进度条效果不错,于是上网查了资料.学习了Mode ...

  7. InstallShield自定义安装界面

    原文:InstallShield自定义安装界面 版权声明: 可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息. 前言: 对于一些InstallShield用户或企业,对于安装包界面除了 ...

  8. Inno Setup自定义安装界面脚本

    ; 脚本由 Inno Setup 脚本向导 生成! ; 有关创建 Inno Setup 脚本文件的详细资料请查阅帮助文档! #define MyAppName "RemoteCard&quo ...

  9. NSIS安装界面无虚线框移动

    最近很多应用程序都在安装界面的美化上面下足了功夫,一个漂亮流畅的安装界面无疑会给其带来用户体验上的加分,其中一个无虚线框跟随鼠标移动比较有趣,狂翻msdn后终于找到了控制函数SystemParamet ...

随机推荐

  1. HTTP协议-工作原理及消息结构

    HTTP协议 HTTP协议是Hyper Test Transfer Protocol(超文本传输协议)的缩写 适用于从万维网(WWW:World Wide Web)服务器传输超文本到本地浏览器的传输协 ...

  2. Nginx搭建简易文件服务器

    Nginx搭建简易文件服务器 1.安装nginx,此处略过 2.修改nginx配置文件 详细如下 # 此处为部分文件是否有权限,使用root,则不会出现403权限问题 user root; worke ...

  3. 叫高二上一调?简要题解 (ACD)

    A. 电压机制 题意转换为所有奇环的并排除掉所有偶环留下的边的个数 . 建出 DFS 树,然后只有返祖边可能构成环 . 于是类似树上差分,\(odd_u\) 统计奇环,\(even_u\) 统计偶环 ...

  4. mysql 跨库事务XA

    前一段时间在工作中遇到了跨库事务问题,后来在网上查询了一下,现在做一下整理和总结. 1.首先要确保mysql开启XA事务支持 SHOW VARIABLES LIKE '%XA%' 如果innodb_s ...

  5. MMDetection 使用示例:从入门到出门

    前言 最近对目标识别感兴趣,想做一些有趣目标识别项目自己玩耍,本来选择的是 YOLOV5 的,但无奈自己使用 YOLOV5 环境训练模型时,不管训练多少次 mAP 指标总是为 0,而其它 pytorc ...

  6. ceph 004 纠删码池 修改参数 cephx认证

    复习ceph003 存储池为逻辑概念,存储池可以占用整个集群的所有空间 [root@ceph01 ~]# ceph osd pool create pool1 pool 'pool1' created ...

  7. Flask 运行报错 HTTPStatus.BAD_REQUEST This site can’t provide a secure connection

    这时候将访问的url,从https换成http 就好啦!!!!!!!!!!!!!

  8. [HFCTF2020]EasyLogin-1|JWT身份伪造

    1.打开之后只有一个登陆界面和注册界面,右键检查发现app.js代码,结果如下: app.js代码如下: /** * 或许该用 koa-static 来处理静态文件 * 路径该怎么配置?不管了先填个根 ...

  9. [WPF]WPF设置单实例启动

    WPF设置单实例启动 使用Mutex设置单实例启动 using System; using System.Threading; using System.Windows; namespace Test ...

  10. 【Prometheus+Grafana系列】监控MySQL服务

    前言 前面的一篇文章已经介绍了 docker-compose 搭建 Prometheus + Grafana 服务.当时实现了监控服务器指标数据,是通过 node_exporter.Prometheu ...