Search code examples
installationnsis

Show finish page if user click cancel on license page NSIS


I have two license page and in the second license page, if user choose not to install the 3rd party app, it will show finish page. So far I use MUI_CUSTOMFUNCTION_ABORT onUserAbort to move into finish page.

But the problem is when user click Skip button (it's actually Cancel button and I rename it into Skip), it will stay on license page and the Install button change to Next button (image 1 -> image 2 -> image 3). I know this is happen because I call Abort in onUserAbort. If I don't call Abort, then the window will automatically close when user click Skip.

Do you have any idea how to directly move to finish page? (image 1 -> image 3, without image 2)

!insertmacro MUI_PAGE_WELCOME
page custom CheckHWSpecs ShowNotMeetRequirementDialog
!insertmacro MUI_PAGE_LICENSE "${SOURCEFOLDER}\license1.txt"
!define MUI_DIRECTORYPAGE_VERIFYONLEAVE
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_STARTMENU Application $StartMenuGroup
!insertmacro MUI_PAGE_INSTFILES
!define MUI_LICENSEPAGE_CHECKBOX
!define MUI_PAGE_CUSTOMFUNCTION_PRE Lic2Pre
!define MUI_PAGE_CUSTOMFUNCTION_SHOW Lic2Show
!insertmacro MUI_PAGE_LICENSE "${SOURCEFOLDER}\license2.txt"
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES

!define MUI_CUSTOMFUNCTION_ABORT onUserAbort
!insertmacro MUI_LANGUAGE English

The code on Lic2Pre:

Function Lic2Pre
    StrCpy $R8 2
FunctionEnd

The code on Lic2Show:

Function Lic2Show
    GetDlgItem $0 $hwndparent 2
    SendMessage $0 ${WM_SETTEXT} 0 "STR:Skip"

    !insertmacro SelectSection ${SEC0013}
    !insertmacro UnselectSection ${SEC0000}
    !insertmacro UnselectSection ${SEC0002}
    !insertmacro UnselectSection ${SEC0003}
    !insertmacro UnselectSection ${SEC0004}
    !insertmacro UnselectSection ${SEC0005}
    !insertmacro UnselectSection ${SEC0007}
    !insertmacro UnselectSection ${SEC0010}
    !insertmacro UnselectSection ${SEC0011}
    !insertmacro UnselectSection ${SEC0012}
FunctionEnd

The code to go into specific page:

Function RelGotoPage
  IntCmp $R9 0 0 Move Move
    StrCmp $R9 "X" 0 Move
      StrCpy $R9 "120"

  Move:
  SendMessage $HWNDPARENT "0x408" "$R9" ""
FunctionEnd

The custom function on user abort:

Function onUserAbort
  StrCmp $R8 2 0 End
    StrCpy $R9 2
    Call RelGotoPage
    Abort
  End:
FunctionEnd

Image 1: The second license page

Image 2: If user click Skip

Image 3: Finish Page


Solution

  • !include Sections.nsh
    !include WinMessages.nsh
    ShowInstDetails show
    !define MUI_CUSTOMFUNCTION_ABORT onUserAbort
    !include MUI2.nsh
    !insertmacro MUI_PAGE_WELCOME
    !insertmacro MUI_PAGE_LICENSE "${NSISDIR}\Examples\example1.nsi"
    !insertmacro MUI_PAGE_INSTFILES
    !define MUI_LICENSEPAGE_CHECKBOX
    !define MUI_LICENSEPAGE_CHECKBOX_TEXT "Blah blah blah app and agree..."
    !define MUI_PAGE_CUSTOMFUNCTION_SHOW Lic2Show
    !define MUI_PAGE_CUSTOMFUNCTION_LEAVE Lic2Leave
    !insertmacro MUI_PAGE_LICENSE "${NSISDIR}\Examples\example2.nsi"
    !insertmacro MUI_PAGE_INSTFILES
    !insertmacro MUI_PAGE_FINISH
    !insertmacro MUI_LANGUAGE English
    
    Section /o "Bonus app" SID_BONUS
    DetailPrint "Installing bonus app..."
    Sleep 2222
    SectionEnd
    
    Section "Main app" SID_MAIN
    DetailPrint "Installing main app..."
    Sleep 2222
    SectionEnd
    
    var installBonus
    Function Lic2Show
    StrCpy $installBonus 1
    GetDlgItem $0 $hwndparent 2
    SendMessage $0 ${WM_SETTEXT} 0 "STR:&Skip"
    !insertmacro UnselectSection ${SID_MAIN} ; Already installed, uncheck
    FunctionEnd
    
    Function Lic2Leave
    ${If} $installBonus == 1
        !insertmacro SelectSection ${SID_BONUS}
    ${EndIf}
    FunctionEnd
    
    Function onUserAbort
    ${If} $installBonus == 1
        StrCpy $installBonus 0
        System::Call 'USER32::PostMessage(i$HWNDPARENT,i0x408,i 1,i0)' ; Delayed skip 1 page
        Abort
    ${EndIf}
    FunctionEnd