【问题标题】:NSIS - Run program on finish only if installedNSIS - 仅在安装完成后运行程序
【发布时间】:2012-12-02 02:06:52
【问题描述】:

我有一个有效的 NSIS Modern UI 2 脚本,它有五个组件。其中一个是主应用程序,还有四个辅助应用程序。由于应用程序的性质,它们都不需要另一个运行;因此,它们都是可选安装。这包括主应用程序。

在完成页面,我可以选择启动主应用程序

!define MUI_FINISHPAGE_RUN "$INSTDIR\MyProgram.exe"
!define MUI_FINISHPAGE_RUN_TEXT "Start the main program"

只要在

之前
!insertmacro MUI_PAGE_FINISH

命令。但是,如果用户不安装主应用程序,我不希望复选框可见(或至少启用)。

我尝试将前两行放在Section MainSection 中,但它没有显示该框,因为到那时,UI 已经创建。

我不希望始终启用它,而是指向一个在已安装时运行的函数,否则显示MessageBox

有没有办法做到这一点?

【问题讨论】:

    标签: installation nsis


    【解决方案1】:

    那些MUI定义在编译时使用,你需要在运行时修改复选框:

    !include LogicLib.nsh
    !include MUI2.nsh
    !insertmacro MUI_PAGE_COMPONENTS
    !insertmacro MUI_PAGE_INSTFILES
    !define MUI_FINISHPAGE_RUN "$instdir\Maybe.exe"
    !define MUI_PAGE_CUSTOMFUNCTION_SHOW ModifyRunCheckbox
    !insertmacro MUI_PAGE_FINISH
    !insertmacro MUI_LANGUAGE English
    
    Section "Maybe" SID_MAYBE
    ; File "Maybe.exe"
    SectionEnd
    
    Function ModifyRunCheckbox
    ${IfNot} ${SectionIsSelected} ${SID_MAYBE} ; You could also check if the file exists...
        SendMessage $mui.FinishPage.Run ${BM_SETCHECK} ${BST_UNCHECKED} 0
        EnableWindow $mui.FinishPage.Run 0 ; Or ShowWindow $mui.FinishPage.Run 0
    ${EndIf}
    FunctionEnd
    

    【讨论】:

    • 太棒了!感谢您的帮助。
    • 如果您发现自己想以编程方式更改“运行”文本 - SendMessage $mui.FinishPage.Run ${WM_SETTEXT} 0 "STR:New Text Here"
    • @sonyisda1 或者只定义 MUI_FINISHPAGE_RUN_TEXT
    • @Anders 是的,但如果需要根据安装程序的某些逻辑或模式进行动态调整,则用于运行时。只是在这种特殊情况下帮助其他人的评论。我花了一段时间搜索找到该命令来更改文本而不使用在编译时定义的 MUI_FINISHPAGE_RUN_TEXT
    • @sonyisda1 我很确定如果需要动态变量,您可以在该定义中使用变量。
    猜你喜欢
    • 1970-01-01
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-08
    • 1970-01-01
    相关资源
    最近更新 更多