簡體   English   中英

像在TeamViewer中一樣進行NSIS安裝(便攜式模式選項)

[英]NSIS Install like in TeamViewer (Portable mode option)

我基本上想要的是NSIS安裝程序的類似TeamViewer的首頁,並具有以下選項:

  1. 3個單選按鈕:僅運行; 為當前用戶安裝; 為所有用戶安裝(需要以管理員權限重新啟動)。
  2. 像TeamViewer中一樣的許可證標簽(即沒有實際的EULA頁面,僅在頁腳中有指向該鏈接的鏈接)。
  3. 可以更改文本的按鈕,即“接受並運行”或“接受並安裝”。

我不能從UI和控制流方面弄清楚如何輕松地做到這一點。

如果用戶決定為所有用戶安裝程序,我也需要重新啟動安裝程序的能力(即,我猜應該有一個可檢測到的命令行開關,以便如果當前的安裝程序將自動采用第3種安裝類型)。

根據要求提供的示例UI屏幕截圖:

在此處輸入圖片說明

樣本NSIS模板將不勝感激。

謝謝。

...
RequestExecutionLevel user

!include LogicLib.nsh
!include nsDialogs.nsh
!include FileFunc.nsh
!include MUI2.nsh

Var mode
Var modeRadioRun
Var modeRadioInstCU
Var modeRadioInstLM

Function OnRadioChange
GetDlgItem $1 $hwndparent 1 ; Find Install/Next button
${NSD_GetState} $modeRadioRun $0
${If} $0 = ${BST_CHECKED} 
    ${NSD_SetText} $1 "Accept && Run" 
${Else}
    ${NSD_SetText} $1 "Accept && Install" 
${EndIf}
FunctionEnd

Function ModePageCreate
!insertmacro MUI_HEADER_TEXT "Welcome to blah" "blah blah"

${GetParameters} $0
ClearErrors
${GetOptions} "$0" "/ELEVATEDINSTALL" $0
${IfNot} ${Errors}
    UserInfo::GetAccountType
    Pop $0
    ${If} $0 == "Admin"
        StrCpy $mode 1
        Abort ; Skip page and start installing
    ${Else}
        MessageBox mb_iconstop "Admin rights required!"
    ${EndIf}
${EndIf}

nsDialogs::Create 1018
Pop $0

${NSD_CreateRadioButton} 30u 20u 50% 12u "Run"
Pop $modeRadioRun
${NSD_OnClick} $modeRadioRun OnRadioChange

${NSD_CreateRadioButton} 30u 40u 50% 12u "Install for current user"
Pop $modeRadioInstCU
${NSD_OnClick} $modeRadioInstCU OnRadioChange

${NSD_CreateRadioButton} 30u 60u 50% 12u "Install for all users"
Pop $modeRadioInstLM
${NSD_OnClick} $modeRadioInstLM OnRadioChange

${NSD_CreateLink} 20u -14u 50% 12u "License"
Pop $0
${NSD_OnClick} $0 ShowLicense

${NSD_Check} $modeRadioRun
call OnRadioChange ; Trigger button change
nsDialogs::Show
FunctionEnd

Function ModePageLeave
${NSD_GetState} $modeRadioRun $0
${NSD_GetState} $modeRadioInstCU $1
${If} $0 = ${BST_CHECKED}
    InitPluginsDir
    SetOutPath $pluginsdir
    File "myapp.exe"
    ExecWait '"$pluginsdir\myapp.exe"'
    SetOutPath $temp ; Don't lock $pluginsdir
    Quit
${ElseIf} $1 = ${BST_CHECKED}
    StrCpy $mode 0
${Else}
    StrCpy $mode 1
    UserInfo::GetAccountType
    Pop $0
    ${If} $0 != "Admin"
        ExecShell "runas" '"$exepath"' "/ELEVATEDINSTALL"
        Quit
    ${EndIf}
${EndIf}
FunctionEnd

Function ShowLicense
ExecShell "" "http://example.com/license"
FunctionEnd

Page Custom ModePageCreate ModePageLeave
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"

Section
${If} $mode > 0
    SetShellVarContext all
    StrCpy $InstDir "$ProgramFiles\MyApp"
${Else}
    SetShellVarContext current
    StrCpy $InstDir "$LocalAppData\Programs\MyApp"
${EndIf}

SetOutPath $InstDir
File myapp.exe
CreateShortcut "$SMPrograms\MyApp.lnk" "$InstDir\myapp.exe"
WriteUninstaller "$InstDir\Uninst.exe"
WriteRegStr SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\MyAppGuid" "UninstallString" '"$InstDir\Uninst.exe"'
WriteRegStr SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\MyAppGuid" "DisplayName" "MyApp blah blah"
SectionEnd

Section Uninstall
; Todo: Remove files and registry entries (You should write to a .ini in $InstDir so you know if it was a per user or machine install)
RMDir "$InstDir"
SectionEnd

您可能要編輯基本UI,以使用Resource Hacker (在NSIS \\ Contrib \\ UIs中的一個文件上)使安裝按鈕更大,並在腳本中使用ChangeUI來應用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM