如何为NSIS安装器的初始解压阶段添加进度条?
在NSIS初始解压阶段添加进度条
当然可以给NSIS的初始解压阶段加上进度条,解决用户误以为安装器未运行的问题,具体实现方式如下:
核心方案
利用NSIS的解压回调机制配合自定义UI(或Modern UI库),在解压开始前先弹出进度窗口,通过回调函数实时更新解压进度。
具体实现代码示例
下面是用Modern UI实现的最简版本:
!include "MUI2.nsh" ; 保持你的压缩配置 SetCompress force SetCompressor /SOLID LZMA ; 定义解压回调函数 !define NSIS_UNPACK_CALLBACK "UnpackProgressCallback" ; 初始化阶段显示进度窗口 Function .onInit ; 先创建一个简单的进度窗口(需要提前准备Progress.ini配置文件) !insertmacro MUI_INSTALLOPTIONS_DISPLAY "Progress.ini" FunctionEnd ; 解压回调函数,更新进度条 Function UnpackProgressCallback Pop $0 ; 获取NSIS传递的当前进度值(0-100) ; 把进度值写入进度条控件 !insertmacro MUI_INSTALLOPTIONS_WRITE "Progress.ini" "Field 2" "State" $0 FunctionEnd ; 你的安装主逻辑 Section "主程序安装" ; 这里写你的文件复制、注册表写入等安装代码 SectionEnd
补充说明
- Progress.ini配置示例:你需要在安装脚本同目录下创建这个ini文件,定义进度窗口的样式:
[Settings] NumFields=2 [Field 1] Type=Label Text="正在初始化安装程序..." Left=10 Top=10 Right=290 Bottom=25 [Field 2] Type=ProgressBar Left=10 Top=30 Right=290 Bottom=40
- 无Modern UI的手动实现:如果不想依赖Modern UI,也可以用原生NSIS命令创建窗口和进度条,在回调里用
SendMessage更新进度:
Function .onInit CreateDialog 0 0 300 50 CreateProgressBar 10 30 280 10 ShowDialog FunctionEnd Function UnpackProgressCallback Pop $0 SendMessage $HWNDPARENT ${PBM_SETPOS} $0 0 FunctionEnd
- 固实压缩模式下,进度是按压缩块计算的,可能不会完全线性,但足够让用户感知到安装器在运行。
内容的提问来源于stack exchange,提问作者mojo
相关产品推荐
相关产品推荐

