You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

补充说明

  1. 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
  1. 无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
  1. 固实压缩模式下,进度是按压缩块计算的,可能不会完全线性,但足够让用户感知到安装器在运行。

内容的提问来源于stack exchange,提问作者mojo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 01:33:15