基于NSIS实现Windows卸载前确认弹窗功能求助
实现NSIS卸载前的双场景确认弹窗
要解决你提到的两种卸载场景下的确认弹窗需求,我们可以利用NSIS的uninst.onInit函数来统一处理——不管是直接运行卸载程序,还是通过控制面板触发卸载,这个初始化函数都会在卸载流程启动前执行,刚好适合在这里加入确认逻辑。
具体实现步骤
- 添加卸载初始化函数
uninst.onInit,在里面弹出确认对话框; - 如果用户选择取消卸载,调用
Abort终止整个卸载流程; - 保留你原有的卸载清理逻辑,确保文件、注册表等资源正常删除。
修改后的完整代码
; 确保已包含MUI核心定义(若脚本已有可忽略) !include "MUI2.nsh" ; 保留你原有的卸载文件处理页 !insertmacro MUI_UNPAGE_INSTFILES ; 卸载初始化函数:统一处理两种场景的确认弹窗 Function uninst.onInit ; 带问号图标的确认对话框,用户选择"是"则继续,"否"则终止卸载 MessageBox MB_YESNO|MB_ICONQUESTION "Are you sure you want to uninstall?" IDYES proceed IDNO cancel cancel: Abort ; 用户取消,直接终止卸载流程 proceed: FunctionEnd Section "Uninstall" ; 移除注册表项 DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\EMR" DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\EMR\Electronic Edition" DeleteRegKey HKLM "SOFTWARE\EMR\Electronic Edition" DeleteRegKey HKLM "SOFTWARE\EMR" ; 删除安装目录内的文件与卸载程序 Delete $INSTDIR\EMR_4.0.1.nsi Delete $INSTDIR\uninstall.exe ; 删除快捷方式(若存在) Delete "$INSTDIR\EMR\Electronic Edition\*.*" ; 逐级移除目录 RMDir "$INSTDIR\EMR\Electronic Edition" RMDir "$INSTDIR\EMR" RMDir "$INSTDIR" RMDir /r /REBOOTOK $INSTDIR SectionEnd ; 加载MUI语言包(若脚本已有可忽略) !insertmacro MUI_LANGUAGE "English"
关键说明
uninst.onInit函数:这是NSIS卸载程序的固定初始化入口,所有卸载触发方式(直接运行卸载程序/控制面板卸载)都会先执行这里的代码,完美覆盖你需要的两种场景;MessageBox指令:MB_YESNO|MB_ICONQUESTION指定了对话框的样式(带问号图标、是/否按钮),用户点击"NO"时,Abort指令会直接终止卸载流程,不会执行后续的清理操作;点击"YES"则正常进入卸载步骤;- 如果你的原有脚本已经包含了
!include "MUI2.nsh"和语言包加载宏,无需重复添加,保持原有配置即可。
内容的提问来源于stack exchange,提问作者prakash




