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

来源:互联网 发布:mac虚拟机安装教程win7 编辑:程序博客网 时间:2024/05/05 17:26

几乎所有玩过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} #定义nsis未包含的进度条相关常量
#编写:水晶石
InstallDir "C:\test"
page custom custompage

Function custompage
nsDialogs::Create 1018
  
Pop $0
  ${NSD_CreateLabel} 
100 100 10030"开始安装..."
  
Pop $9
  
SetCtlColors $9  0x000000 0xECE9D8
  
${NSD_CreateProgressBar} 0 50 10020 ""
  
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

0 0
原创粉丝点击