最新消息:

自定义安装界面准确获取安装进度完美解决方案

nsis 永恒心锁 2307浏览 0评论

几乎所有玩过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 "$OUTDIRtest.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
免责声明:根据《计算机软件保护条例》第十七条规定“为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。”您需知晓本站所有内容资源均来源于网络,仅供用户交流学习与研究使用,版权归属原版权方所有,版权争议与本站无关,用户本人下载后不能用作商业或非法用途,需在24个小时之内从您的电脑中彻底删除上述内容,否则后果均由用户承担责任;如果您访问和下载此文件,表示您同意只将此文件用于参考、学习而非其他用途,否则一切后果请您自行承担,如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。丨本站为个人博客非盈利性站点,所有软件信息均来自网络,所有资源仅供学习参考研究目的,并不贩卖软件,不存在任何商业目的及用途。丨本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权BY-NC-SA协议进行授权

转载请注明:永恒心锁-分享互联网 » 自定义安装界面准确获取安装进度完美解决方案

您必须 登录 才能发表评论!