【问题标题】:How to create shortcut for desktop and startmenu after installation in NSIS?在 NSIS 中安装后如何为桌面和开始菜单创建快捷方式?
【发布时间】:2021-10-25 08:00:29
【问题描述】:

我是 NSIS 的新手。我正在尝试在安装后(即在完成页面之前)添加以下页面样式。任何人都可以建议,我们是否可以做一个自定义页面并添加必要的复选框、单选按钮和程序组?或任何其他建议。

下面是我的页面顺序:

!insertmacro MUI_PAGE_DIRECTORY
  
  ;Custom page for selecting service name to restart.
  Page custom nsDialogsSelectService ngDialogSelectServicePageLeave 
  
  ; variable and text for the app data dir
  !define MUI_DIRECTORYPAGE_VARIABLE $appDataDir
  !define MUI_PAGE_HEADER_TEXT "Choose Data Directory"
  !define MUI_PAGE_HEADER_SUBTEXT "Choose the folder in which to install application data for ${PRODUCT_FULL} ${PVERSION}."
  !define MUI_DIRECTORYPAGE_TEXT_TOP "Setup will install data directory need todo.  To install in a different folder, click Browse and select another folder.  Click Next to Continue."
  !define MUI_DIRECTORYPAGE_TEXT_DESTINATION "Destination Folder"
  !insertmacro MUI_PAGE_DIRECTORY 
  !insertmacro MUI_PAGE_INSTFILES
  
  !define MUI_FINISHPAGE_TITLE_3LINES
  
  Page custom nsDialogShortcut ngDialogShortcutPageLeave ;Page contain checkbox , based on the selection of checkbox I am showing Startmenu and then finish page.
  
  !insertmacro MUI_PAGE_STARTMENU 0 $SMDir  
  !insertmacro MUI_PAGE_FINISH

【问题讨论】:

  • 所有这些在技术上都是可行的,但是让用户选择用户/机器(你真好)是有问题的。由于 UAC,您必须选择其中一个...
  • 您通常应该尝试在 InstFiles 页面之前收集尽可能多的信息。您可以在之后移动快捷方式页面并在离开回调或 .onInstSuccess 中执行操作,但实际上没有理由这样做。

标签: nsis modern-ui


【解决方案1】:

让用户选择用户/机器快捷方式与 UAC 的工作方式相冲突。当非管理员用户使用管理员帐户提升权限时,安装程​​序最终会以“错误”的配置文件运行。

Windows 指南规定只有应用程序套件(带有单独的主要应用程序,如 MS Office)才能创建“开始”菜单文件夹。常规应用程序应直接在 $SMPrograms 中创建其(单个)快捷方式。您不应创建卸载程序或帮助文件的快捷方式。您还应该避免创建桌面快捷方式。

这意味着您可以简单地使用组件页面来提供快捷方式选项:

!include MUI2.nsh
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_LANGUAGE English

Section "Program files"
SectionIn RO
SetOutPath $InstDir
File "MyApp.exe"
SectionEnd

Section "Start menu shortcut"
CreateShortcut "$SMPrograms\$(^Name).lnk" "$InstDir\MyApp.exe"
SectionEnd

Section /o "Desktop shortcut"
CreateShortcut "$Desktop\$(^Name).lnk" "$InstDir\MyApp.exe"
SectionEnd

或作为完成页面上的复选框:

!include MUI2.nsh
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!define MUI_FINISHPAGE_SHOWREADME ""
!define MUI_FINISHPAGE_SHOWREADME_TEXT "Create Start menu shortcut"
!define MUI_FINISHPAGE_SHOWREADME_FUNCTION CreateShortcuts
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_LANGUAGE English

Function CreateShortcuts
CreateShortcut "$SMPrograms\$(^Name).lnk" "$InstDir\MyApp.exe"
FunctionEnd

如果您确实有一套应用程序,那么您可以使用“开始”菜单页面提示输入文件夹名称:

Var SMFolder

!include MUI2.nsh
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE STARTMENU Suite $SMFolder
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_LANGUAGE English

Section
!insertmacro MUI_STARTMENU_WRITE_BEGIN Suite
CreateDirectory "$SMPrograms\$SMFolder"
CreateShortcut "$SMPrograms\$SMFolder\App1.lnk" "$InstDir\MyApp1.exe"
CreateShortcut "$SMPrograms\$SMFolder\App2.lnk" "$InstDir\MyApp2.exe"
; TODO: Write $SMFolder to the registry or a .ini so your uninstaller can delete the folder
!insertmacro MUI_STARTMENU_WRITE_END
SectionEnd

万一您拥有一套应用程序并且还想创建桌面快捷方式,那么是的,您需要使用自定义页面:

Var SMDir
Var SMCheck
Var DeskCheck
Var SMList
Var SMDirEdit

!include LogicLib.nsh
!include nsDialogs.nsh
!include MUI2.nsh
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_DIRECTORY
Page Custom MyShortcutsPageCreate MyShortcutsPageLeave
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_LANGUAGE English

Function .onInit
StrCpy $SMDir "$(^Name)" ; Default
StrCpy $SMCheck ${BST_CHECKED}
FunctionEnd

Function MyShortcutsPageCreate
!insertmacro MUI_HEADER_TEXT "Shortcuts" "Shortcuts blah blah blah"
nsDialogs::Create 1018
Pop $0
${IfThen} $0 == error ${|} Abort ${|}

${NSD_CreateCheckbox} 0 0u 50% 12u "Create Start menu shortcuts"
Pop $R8
SendMessage $R8 ${BM_SETCHECK} $SMCheck ""

${NSD_CreateCheckbox} 0 14u 50% 12u "Create desktop shortcuts"
Pop $R9
SendMessage $R9 ${BM_SETCHECK} $DeskCheck ""

${NSD_CreateSortedListBox} 0 28u 100% -43u ""
Pop $SMList

${NSD_CreateText} 0 -13u 100% 12u "$SMDir"
Pop $SMDirEdit

${NSD_LB_AddString} $SMList "(Default)"
${NSD_LB_SetItemData} $SMList 0 1 ; Mark as special
SetShellVarContext Current
Call FillSMList
SetShellVarContext All
Call FillSMList
SetShellVarContext ? ; TODO: Restore to what you actually are installing as
${NSD_OnChange} $SMList OnSMListChanged

${NSD_OnClick} $R8 OnSMCheckChanged
Push $R8
Call OnSMCheckChanged
nsDialogs::Show
FunctionEnd

Function FillSMList
FindFirst $0 $1 "$SMPrograms\*"
loop:
    StrCmp $1 "" done
    ${If} ${FileExists} "$SMPrograms\$1\*.*"
    ${AndIf} $1 != "."
    ${AndIf} $1 != ".."
        ${NSD_LB_FindStringExact} $SMList "$1" $2
        ${If} $2 < 0
            ${NSD_LB_AddString} $SMList $1
        ${EndIf}
    ${EndIf}
    FindNext $0 $1
    Goto loop
done:
FindClose $0
FunctionEnd

Function OnSMCheckChanged
Pop $0
${NSD_GetChecked} $0 $0
EnableWindow $SMList $0
EnableWindow $SMDirEdit $0
FunctionEnd

Function OnSMListChanged
Pop $0
${NSD_LB_GetSelection} $SMList $0
${NSD_SetText} $SMDirEdit "$0\$(^Name)"
${NSD_LB_GetSelectionIndex} $SMList $0
${NSD_LB_GetItemData} $SMList $0 $0
${If} $0 <> 0
    ${NSD_SetText} $SMDirEdit "$(^Name)"
${EndIf}
FunctionEnd

Function MyShortcutsPageLeave
${NSD_GetChecked} $R8 $SMCheck
${NSD_GetChecked} $R9 $DeskCheck
${NSD_GetText} $SMDirEdit $SMDir
FunctionEnd


Section
${If} $SMCheck <> 0
    CreateDirectory "$SMPrograms\$SMDir"
    CreateShortcut "$SMPrograms\$SMDir\App1.lnk" "$InstDir\App1.exe"
    CreateShortcut "$SMPrograms\$SMDir\App2.lnk" "$InstDir\App2.exe"
${EndIf}

${If} $DeskCheck <> 0
    CreateShortcut "$Desktop\App1.lnk" "$InstDir\App1.exe"
    CreateShortcut "$Desktop\App2.lnk" "$InstDir\App2.exe"
${EndIf}
SectionEnd

【讨论】:

  • 感谢您的帮助。我已经实施了这个建议并简化了它。
猜你喜欢
  • 2010-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-10
相关资源
最近更新 更多