You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

基于NSIS实现Windows卸载前确认弹窗功能求助

实现NSIS卸载前的双场景确认弹窗

要解决你提到的两种卸载场景下的确认弹窗需求,我们可以利用NSIS的uninst.onInit函数来统一处理——不管是直接运行卸载程序,还是通过控制面板触发卸载,这个初始化函数都会在卸载流程启动前执行,刚好适合在这里加入确认逻辑。

具体实现步骤

  1. 添加卸载初始化函数uninst.onInit,在里面弹出确认对话框;
  2. 如果用户选择取消卸载,调用Abort终止整个卸载流程;
  3. 保留你原有的卸载清理逻辑,确保文件、注册表等资源正常删除。

修改后的完整代码

; 确保已包含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

火山引擎 最新活动