繁体   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