NSIS安装完成后如何创建桌面、开始菜单快捷方式及添加自定义页面
完全可以创建单个自定义页面集成你需要的复选框、单选按钮、程序组配置项,不需要拆分多个页面,用NSIS自带的nsDialogs插件即可实现。
以下是两种适配你现有页面序列的实现方案,可根据改造成本选择:
方案1:改造现有自定义页面(最小改动)
你现有代码中已经在!insertmacro MUI_PAGE_INSTFILES之后声明了Page custom nsDialogShortcut ngDialogShortcutPageLeave自定义页面,直接在这个页面的创建回调里新增需要的控件即可,不需要调整现有页面顺序,也不用额外新增页面。
参考实现代码如下:
; 提前声明控件变量 Var hCtl_Radio_ServiceA Var hCtl_Radio_ServiceB Var hCtl_Checkbox_AutoStart Var hCtl_Text_StartMenuGroup Var hCtl_Btn_BrowseGroup Function nsDialogShortcut !insertmacro MUI_HEADER_TEXT "附加配置" "请选择你需要的安装选项后点击下一步" nsDialogs::Create 1018 Pop $0 ; 添加单选按钮组(示例为选择要重启的服务) ${NSD_CreateRadioButton} 0 0 100% 12u "重启服务A" Pop $hCtl_Radio_ServiceA ${NSD_SetState} $hCtl_Radio_ServiceA ${BST_CHECKED} ; 设置默认选中 ${NSD_CreateRadioButton} 0 15u 100% 12u "重启服务B" Pop $hCtl_Radio_ServiceB ; 添加自定义复选框 ${NSD_CreateCheckBox} 0 35u 100% 12u "系统重启后自动启动应用" Pop $hCtl_Checkbox_AutoStart ; 添加程序组配置项 ${NSD_CreateLabel} 0 55u 30u 12u "程序组:" Pop $0 ${NSD_CreateText} 35u 55u 70% 12u "我的应用程序" ; 默认程序组名称 Pop $hCtl_Text_StartMenuGroup ${NSD_CreateBrowseButton} 107u 55u 25u 12u "浏览..." Pop $hCtl_Btn_BrowseGroup ${NSD_OnClick} $hCtl_Btn_BrowseGroup BrowseStartMenuGroupCallback nsDialogs::Show FunctionEnd ; 程序组浏览按钮点击回调 Function BrowseStartMenuGroupCallback nsDialogs::SelectFolder "请选择程序组存放位置" "" Pop $0 ${IfNot} $0 == error ${NSD_SetText} $hCtl_Text_StartMenuGroup $0 ${EndIf} FunctionEnd ; 离开页面时统一处理所有选择结果 Function ngDialogShortcutPageLeave ; 读取单选按钮选择结果 ${NSD_GetState} $hCtl_Radio_ServiceA $0 ${If} $0 == ${BST_CHECKED} StrCpy $R0 "ServiceA" ${Else} StrCpy $R0 "ServiceB" ${EndIf} ; 读取复选框状态 ${NSD_GetState} $hCtl_Checkbox_AutoStart $1 ; 读取程序组配置,直接赋值给开始菜单变量即可复用原有创建逻辑 ${NSD_GetText} $hCtl_Text_StartMenuGroup $SMDir ; 此处可直接添加对应操作:重启服务、创建快捷方式、写入配置等 FunctionEnd
使用该方案后,你可以删掉原有的!insertmacro MUI_PAGE_STARTMENU 0 $SMDir声明,所有配置在单个自定义页面完成即可。
方案2:保留原有页面结构(适合新手快速实现)
如果你不想自己实现程序组浏览、校验逻辑,也可以保留现有的MUI_PAGE_STARTMENU,只把需要的复选框、单选按钮加到已有的nsDialogShortcut自定义页面中,页面整体顺序不需要调整,逻辑改动最小。
注意事项
由于自定义页面放在MUI_PAGE_INSTFILES之后,所有控件的选择结果可以直接在离开回调中执行对应操作,不需要等到后续页面处理。如果需要根据用户选择跳过后续页面,可以在离开回调中设置$0 = 1实现跳转。
内容的提问来源于stack exchange,提问作者JDGuide
相关产品推荐
相关产品推荐

