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

如何在NSIS许可页添加确认弹窗,同意后才进入下一页?

NSIS Modern UI 2 许可页弹窗逻辑问题解决

需求

  • 显示EULA(通过!insertmacro MUI_PAGE_LICENSE "${license}"实现)
  • 用户滚动到EULA底部后,启用「继续」按钮
  • 点击「继续」按钮时弹出带三个按钮和一个复选框的弹窗:
    • 「阅读EULA」:关闭弹窗,回到许可页继续阅读
    • 「不同意」:终止安装
    • 「同意」:进入安装流程下一页
  • 复选框控制「同意」按钮的启用/禁用状态

现存问题

  • 弹窗在离开许可页后才显示,希望弹窗属于许可页流程,点击「同意」后才进入下一页
  • Accept函数中不知道如何跳转至下一页
  • 弹窗代码被错误放在instfiles页面的区段中

解决方案

核心思路是替换许可页「继续」按钮的默认回调逻辑,拦截页面跳转,用弹窗控制流程。以下是修改后的完整代码:

!include MUI2.nsh
!include 'LogicLib.nsh'
!include nsDialogs.nsh
!include DlgHost.nsh

; 全局变量定义
var AGREE_BUTTON
var CHECKBOX

Function CloseApp
    Pop $0
    DlgHost::Close
    Quit
FunctionEnd

Function Accept
    Pop $0
    DlgHost::Close
    ; 触发许可页确认逻辑,跳转到下一页
    SendMessage $HWNDPARENT ${WM_COMMAND} ${IDOK} 0
FunctionEnd

Function ReturnToEULA
    Pop $0
    DlgHost::Close
FunctionEnd

Function EnDisableButton
    Pop $CHECKBOX
    ${NSD_GetState} $CHECKBOX $0
    ${If} $0 == 1
        EnableWindow $AGREE_BUTTON 1
    ${Else}
        EnableWindow $AGREE_BUTTON 0
    ${EndIf}
FunctionEnd

Function MyDlgBoxCallback
${Select} $0
${Case} ${DLGHOST_DLGBOXMSG_INITDLG}
    nsDialogs::Create 1018
    Pop $1
    DlgHost::SetClient $1
    ; 创建弹窗控件
    ${NSD_CreateLabel} 5% 5% 87% 35u "请确认您已阅读并理解以下条款:"
    Pop $1
    
    ${NSD_CreateLabel} 5% 25% 87% 30u "我确认已仔细阅读最终用户许可协议(EULA)"
        CreateFont $0 "$(^Font)" "8" "700" ; 加粗字体
        SendMessage $1 ${WM_SETFONT} $0 0
        Pop $1
    
    ${NSD_CreateCheckbox} 5% 55% 87% 30u "&我同意上述许可协议条款"
        Pop $CHECKBOX
        CreateFont $0 "$(^Font)" "8" "700"
        SendMessage $CHECKBOX ${WM_SETFONT} $0 0
        ${NSD_OnClick} $CHECKBOX EnDisableButton

    ; 不同意按钮
    ${NSD_CreateButton} 230u 84% 50u 15u "&不同意"
        Pop $1
        ${NSD_OnClick} $1 CloseApp

    ; 同意按钮(默认禁用)
    ${NSD_CreateButton} 290u 84% 50u 15u "&同意"    
        Pop $AGREE_BUTTON
        EnableWindow $AGREE_BUTTON 0
        ${NSD_OnClick} $AGREE_BUTTON Accept
    
    ; 返回阅读EULA按钮
    ${NSD_CreateButton} 5% 84% 70u 15u "&阅读EULA"
        Pop $1
        ${NSD_OnClick} $1 ReturnToEULA

${Case} ${DLGHOST_DLGBOXMSG_SHOWDLG}
    nsDialogs::Show
${EndSelect}
FunctionEnd

Function ShowConfirmationPopup
    GetFunctionAddress $0 MyDlgBoxCallback
    DlgHost::DlgBox "* $0 p 550 250 确认条款与条件"
FunctionEnd

; 自定义许可页继续按钮的点击行为,替换默认跳转逻辑
!define MUI_LICENSEPAGE_BUTTON "继续"
!define MUI_LICENSEPAGE_BUTTON_CLICK "Call ShowConfirmationPopup"
!insertmacro MUI_PAGE_LICENSE "${license}"

; 后续正常安装页面流程
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES

关键修改说明

  • MUI_LICENSEPAGE_BUTTON_CLICK宏:Modern UI 2提供的自定义许可页按钮点击行为的接口,通过它将「继续」按钮的点击事件绑定到弹窗函数,拦截默认的页面跳转
  • Accept函数的跳转逻辑:使用SendMessage $HWNDPARENT ${WM_COMMAND} ${IDOK} 0模拟许可页默认确认按钮的点击,触发页面跳转
  • 移除冗余代码:删除了原代码中错误添加的空instfiles页面和弹窗区段,将弹窗调用完全整合到许可页流程中

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 15:45:03