如何在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
相关产品推荐
相关产品推荐

