NSIS 的现代用户界面(Modern UI)只是相对于传统(丑陋)的界面而言的“现代”而已。它定义在MUI2.nsh中,nsh 文件类似 C++中的头文件,可以被其他模块包含引用。

📌 推荐:NSIS-UI-Plugin 开源 NSIS UI 插件框架,支持任意第三方界面库。默认使用 Qt 作为界面库的安装包示例。

使用 MUI2 界面需要包含MUI2.nsh

1
!include "MUI2.nsh"

MUI2 界面和传统界面不同之处在于,传统界面使用的Page(或PageEx)语法来标识显示哪些页面,如:

1
2
3
PageEx license
LicenseData "license.rtf" #可以是txt或rtf文件格式
PageExEnd

而 MUI2 使用的是MUI2.nsh中定义的一系列宏来标识显示哪些页面,如:

1
!insertmacro MUI_PAGE_LICENSE "license.rtf"

NSIS教程(4)-传统界面示例类似,这里提供制作网易云音乐的现代用户界面的安装包示例,脚本代码中包含了详细的注释。

高仿网易云音乐安装脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
# ====================== 自定义宏 ==============================
!define PRODUCT_NAME "网易云音乐"
!define EXE_NAME "cloudmusic.exe"
!define PRODUCT_VERSION "1.0.0.1"
!define PRODUCT_PUBLISHER "NetEase"
!define PRODUCT_LEGAL "NetEase 1999-2014"
!define TEMP_DIR ""


# ===================== 外部插件以及宏 =============================
!include "MUI2.nsh"


# ===================== 安装包版本 =============================
VIProductVersion "${PRODUCT_VERSION}"
VIAddVersionKey "ProductVersion" "${PRODUCT_VERSION}"
VIAddVersionKey "ProductName" "${PRODUCT_NAME}"
VIAddVersionKey "CompanyName" "${PRODUCT_PUBLISHER}"
VIAddVersionKey "FileVersion" "${PRODUCT_VERSION}"
VIAddVersionKey "InternalName" "${EXE_NAME}"
VIAddVersionKey "FileDescription" "${PRODUCT_NAME}"
VIAddVersionKey "LegalCopyright" "${PRODUCT_LEGAL}"

# ==================== NSIS属性 ================================
# ZLIB(默认) BZIP2 LZMA
SetCompressor lzma

; 安装包名字.
Name "${PRODUCT_NAME}"

# 安装程序文件名.
OutFile "网易云音乐安装0.exe"

# 默认安装位置.
InstallDir "$PROGRAMFILES\Netease\CloudMusic"


# 设置是否显示安装详细信息。
ShowInstDetails hide

# 设置是否显示卸载详细信息
ShowUnInstDetails hide

# 针对Vista和win7 的UAC进行权限请求.
# RequestExecutionLevel none|user|highest|admin
RequestExecutionLevel admin


# ==================== MUI属性 ==================================
# 安装和卸载程序图标
!define MUI_ICON "image\logo.ico"
!define MUI_UNICON "image\un_logo.ico"


# 如果未使用MUI,则可直接使用.onGUIInit
!define MUI_CUSTOMFUNCTION_GUIINIT onGUIInit


# 安装程序欢迎页面
!insertmacro MUI_PAGE_WELCOME

# 安装程序软件授权申明页面
!insertmacro MUI_PAGE_LICENSE "license.rtf"


# 安装程序显示安装目录选择页面
!insertmacro MUI_PAGE_DIRECTORY

# 安装程序显示安装组件选择页面
!insertmacro MUI_PAGE_COMPONENTS

# 安装程序显示进度页面
!insertmacro MUI_PAGE_INSTFILES

# 安装程序显示安装结束页面
!insertmacro MUI_PAGE_FINISH


# 卸载程序显示进度
!insertmacro MUI_UNPAGE_INSTFILES

# 卸载程序显示安装结束
!insertmacro MUI_UNPAGE_FINISH

# 指定语言,必须在最后指定
!insertmacro MUI_LANGUAGE "SimpChinese"


# ========================= 安装步骤 ===============================

# 区段1
# 区段名以一个 ! 开头,那么该区段的显示名称将以粗体字显示.
Section "!Files" "des_files"

; 设置文件的输出路径
SetOutPath $INSTDIR

; 放置文件
File /r "app\*.*"

SectionEnd


# 区段2
Section "Shortcut" "des_shortcut"
SetShellVarContext all
CreateDirectory "$SMPROGRAMS\${PRODUCT_NAME}"
CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME}.lnk" "$INSTDIR\${EXE_NAME}"
CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\卸载${PRODUCT_NAME}.lnk" "$INSTDIR\uninst.exe"
SetShellVarContext current
SectionEnd


# 区段3
# 区段名为空、遗漏或者以一个 "-" 开头,那么它将是一个隐藏的区段,用户也不能选择禁止它.
Section "-Necessary"

# 生成卸载程序
WriteUninstaller "$INSTDIR\uninst.exe"

# 添加卸载信息到控制面板
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" "DisplayName" "${PRODUCT_NAME}"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" "UninstallString" "$INSTDIR\uninst.exe"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" "DisplayIcon" "$INSTDIR\${EXE_NAME}"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" "Publisher" "$INSTDIR\${PRODUCT_PUBLISHER}"
SectionEnd


# 卸载区段
Section "Uninstall"

; 删除快捷方式
SetShellVarContext all
Delete "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME}.lnk"
Delete "$SMPROGRAMS\${PRODUCT_NAME}\卸载${PRODUCT_NAME}.lnk"
RMDir "$SMPROGRAMS\${PRODUCT_NAME}\"
Delete "$DESKTOP\${PRODUCT_NAME}.lnk"
SetShellVarContext current

SetOutPath "$INSTDIR"

; 删除安装的文件
Delete "$INSTDIR\*.*"

SetOutPath "$DESKTOP"

RMDir /r "$INSTDIR"
RMDir "$INSTDIR"

SetAutoClose true
SectionEnd


# 区段描述
!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
!insertmacro MUI_DESCRIPTION_TEXT ${des_files} "主程序文件"
!insertmacro MUI_DESCRIPTION_TEXT ${des_shortcut} "创建开始菜单和桌面快捷方式"
!insertmacro MUI_FUNCTION_DESCRIPTION_END

# ============================== 回调函数 ====================================

# 函数名以“.”开头的一般作为回调函数保留.
# 函数名以“un.”开头的函数将会被创建在卸载程序里,因此,普通安装区段和函数不能调用卸载函数,而卸载区段和卸载函数也不能调用普通函数。

Function .onInit
FunctionEnd

Function onGUIInit

FunctionEnd


# 安装成功以后.
Function .onInstSuccess

FunctionEnd


# 卸载操作开始前.
Function un.onInit
MessageBox MB_ICONQUESTION|MB_YESNO "你确实要完全删除网易云音乐,及其所有组件吗?" /SD IDYES IDYES +2 IDNO +1
Abort
FunctionEnd

# 卸载成功以后.
Function un.onUninstSuccess
MessageBox MB_ICONINFORMATION|MB_OK "${PRODUCT_NAME} 已成功地从你的计算机移除" /SD IDOK
FunctionEnd

运行效果