NSIS 自定义安装界面准确获取安装进度完美解决方案
友情提醒:随着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 自定义安装界面准确获取安装进度完美解决方案的更多相关文章
- WinForm程序界面假死,寻求完美解决方案
故事的开端是这样的,小白是一个程序员,他确实也是一个小白,目前还在程序员发展的道路上,兢兢业业的小心求学. 有一天,小白接到一个任务,完成一个Winform程序,附加一个功能就是可以读IC卡. 小白终 ...
- zz Windows 10安装教程:硬盘安装Win10 系统步骤(适合32位和64位)
Windows 10安装教程:硬盘安装Win10 系统步骤(适合32位和64位) Posted on 2015年01月28日 by 虾虾 22 Comments 最新的Windows 10 MSD ...
- 以前编写的inno setup脚本,涵盖了自定义安装界面,调用dll等等应用 (转)
以前编写的inno setup脚本,涵盖了自定义安装界面,调用dll等等应用 (转) ; Script generated by the Inno Setup 脚本向导. ; SEE THE DOCU ...
- NSIS自定义目录选择页面制作之安装…
在nsis制作自定义界面中,目录选择页面个人感觉最为繁琐,因为该界面不仅涉及到界面控件的创建,还要涉及到控件消息传递和状态改变时的回调函数通告. 迅雷界面为例: 其中安装目录中的8盘符,在本机中并不存 ...
- Wix 安装部署教程(三)自定义安装界面和行为
接上一篇自定义安装界面,这篇继续探索,首先介绍下,Wix为我们定义了五种风格,每种风格的UI都是有一定顺序的.我们可以改变安装顺序,也可以完全自定义一个Dialog插入其中.比如Wix_Mondo 风 ...
- WPF好看的进度条实现浅谈(效果有点类似VS2012安装界面)
为了界面友好,一般的操作时间较长时,都需要增加进度条提示.由于WPF自带的进度条其实不怎么好看,而且没啥视觉效果.后来,装VS2012时,发现安装过程中进度条效果不错,于是上网查了资料.学习了Mode ...
- InstallShield自定义安装界面
原文:InstallShield自定义安装界面 版权声明: 可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息. 前言: 对于一些InstallShield用户或企业,对于安装包界面除了 ...
- Inno Setup自定义安装界面脚本
; 脚本由 Inno Setup 脚本向导 生成! ; 有关创建 Inno Setup 脚本文件的详细资料请查阅帮助文档! #define MyAppName "RemoteCard&quo ...
- NSIS安装界面无虚线框移动
最近很多应用程序都在安装界面的美化上面下足了功夫,一个漂亮流畅的安装界面无疑会给其带来用户体验上的加分,其中一个无虚线框跟随鼠标移动比较有趣,狂翻msdn后终于找到了控制函数SystemParamet ...
随机推荐
- 【每天学一点-02】创建Node.js的第一个应用
1.引入require模块,使用createServer()创建服务器 [server.js]文件 var http = require('http'); http.createServer(func ...
- 四边形不等式优化 dp (doing)
目录 1. 四边形不等式与决策单调性 2. 决策单调性优化 dp - (i) 关于符号 1. 四边形不等式与决策单调性 定义(四边形不等式) 设 \(w(x,y)\) 是定义在整数集合上的二元函数,若 ...
- 从零开始Blazor Server(5)--权限验证
序 之前我们一直使用的是微软自带的身份验证方式,即使用[Authorize]标签来做. 但是这种方式十分不灵活,微软推荐的方式是加Policy,但是这种方式对我们来说还是不够灵活. 所以本节我们用完全 ...
- Lua 语言
# Lua是一种轻量.小巧的脚本语言,用标准C语言编写并以源码形式开发.设计的摸底是为了嵌入到其他应用程序中,从而为应用程序提供灵活的拓展和定制功能. # Lua安装 # 官网:https://www ...
- Javaweb03-servlet&filter
1.什么是servlet 第一个servlet应用程序,实现servlet接口 定义:凡是实现了servlet api接口(或者继承servlet api接口的实现类)的类就是servlet应用程序: ...
- MyBatis-知识点详解
Mybatis 中$与#的区别 1 #是将传入的值当做字符串的形式,eg:select id,name,age from student where id =#{id},当前端把id值1,传入到后台的 ...
- 海豚调度5月Meetup:6个月重构大数据平台,帮你避开调度升级改造/集群迁移踩过的坑
当今许多企业都有着技术架构的DataOps程度不够.二次开发成本高.迁移成本高.集群部署混乱等情况,团队在技术选型之后发现并不适合自己的需求,但是迁移成本和难度又比较大,甚至前团队还留下了不少坑,企业 ...
- MySQL-配置参数时 报错:remove CMakeCache.txt and rerun cmake.On Debian/Ubuntu......
报错:remove CMakeCache.txt and rerun cmake.On Debian/Ubuntu...... 原因: 1.第一次配置参数时,不完整,出现错误!,(报错也会产生CMak ...
- DevOps落地实践点滴和踩坑记录-(2) -聊聊平台建设
很久没有写文章记录了,上一篇文章像流水账一样,把所见所闻一个个记录下来.这次专门聊聊DevOps平台的建设吧,有些新的体会和思考,希望给正在做这个事情的同学们一些启发吧. DevOps落地实践点滴和踩 ...
- 搭建 Webpack 项目步骤
前言 Node.js 就像是 Java 的虚拟机 + JDK,可以让 js 脱离浏览器沙盒,且提供模块机制.I/O 操作.数据库操作.网络操作等.Node.js 又提供了大量的库,NPM(类似于 Ma ...