; Change shell and registry context based on running ; architecture and chosen install mode. !macro SetContext !if "${INSTALLMODE}" == "currentUser" SetShellVarContext current !else if "${INSTALLMODE}" == "perMachine" SetShellVarContext all !endif ${If} ${RunningX64} !if "${ARCH}" == "x64" SetRegView 64 !else if "${ARCH}" == "arm64" SetRegView 64 !else SetRegView 32 !endif ${EndIf} !macroend ; Checks whether app is running or not and prompts to kill it. !macro CheckIfAppIsRunning executableName productName !define UniqueID ${__LINE__} ; Replace {{product_name}} placeholder in the messages with the passed product name nsis_tauri_utils::StrReplace "$(appRunning)" "{{product_name}}" "${productName}" Pop $R1 nsis_tauri_utils::StrReplace "$(appRunningOkKill)" "{{product_name}}" "${productName}" Pop $R2 nsis_tauri_utils::StrReplace "$(failedToKillApp)" "{{product_name}}" "${productName}" Pop $R3 !if "${INSTALLMODE}" == "currentUser" nsis_tauri_utils::FindProcessCurrentUser "${executableName}" !else nsis_tauri_utils::FindProcess "${executableName}" !endif Pop $R0 ${If} $R0 = 0 IfSilent kill_${UniqueID} 0 ${IfThen} $PassiveMode != 1 ${|} MessageBox MB_OKCANCEL $R2 IDOK kill_${UniqueID} IDCANCEL cancel_${UniqueID} ${|} kill_${UniqueID}: !if "${INSTALLMODE}" == "currentUser" nsis_tauri_utils::KillProcessCurrentUser "${executableName}" !else nsis_tauri_utils::KillProcess "${executableName}" !endif Pop $R0 Sleep 500 ${If} $R0 = 0 ${OrIf} $R0 = 2 Goto app_check_done_${UniqueID} ${Else} IfSilent silent_${UniqueID} ui_${UniqueID} silent_${UniqueID}: System::Call 'kernel32::AttachConsole(i -1)i.r0' ${If} $0 != 0 System::Call 'kernel32::GetStdHandle(i -11)i.r0' System::call 'kernel32::SetConsoleTextAttribute(i r0, i 0x0004)' ; set red color FileWrite $0 "$R1$\n" ${EndIf} Abort ui_${UniqueID}: Abort $R3 ${EndIf} cancel_${UniqueID}: Abort $R1 ${EndIf} app_check_done_${UniqueID}: !undef UniqueID !macroend ; Sets AppUserModelId on a shortcut !macro SetLnkAppUserModelId shortcut !insertmacro ComHlpr_CreateInProcInstance ${CLSID_ShellLink} ${IID_IShellLink} r0 "" ${If} $0 P<> 0 ${IUnknown::QueryInterface} $0 '("${IID_IPersistFile}",.r1)' ${If} $1 P<> 0 ${IPersistFile::Load} $1 '("${shortcut}", ${STGM_READWRITE})' ${IUnknown::QueryInterface} $0 '("${IID_IPropertyStore}",.r2)' ${If} $2 P<> 0 System::Call 'Oleaut32::SysAllocString(w "${BUNDLEID}") i.r3' System::Call '*${SYSSTRUCT_PROPERTYKEY}(${PKEY_AppUserModel_ID})p.r4' System::Call '*${SYSSTRUCT_PROPVARIANT}(${VT_BSTR},,&i4 $3)p.r5' ${IPropertyStore::SetValue} $2 '($4,$5)' System::Call 'Oleaut32::SysFreeString($3)' System::Free $4 System::Free $5 ${IPropertyStore::Commit} $2 "" ${IUnknown::Release} $2 "" ${IPersistFile::Save} $1 '("${shortcut}",1)' ${EndIf} ${IUnknown::Release} $1 "" ${EndIf} ${IUnknown::Release} $0 "" ${EndIf} !macroend ; Deletes jump list entries and recent destinations !macro DeleteAppUserModelId !insertmacro ComHlpr_CreateInProcInstance ${CLSID_DestinationList} ${IID_ICustomDestinationList} r1 "" ${If} $1 P<> 0 ${ICustomDestinationList::DeleteList} $1 '("${BUNDLEID}")' ${IUnknown::Release} $1 "" ${EndIf} !insertmacro ComHlpr_CreateInProcInstance ${CLSID_ApplicationDestinations} ${IID_IApplicationDestinations} r1 "" ${If} $1 P<> 0 ${IApplicationDestinations::SetAppID} $1 '("${BUNDLEID}")i.r0' ${If} $0 >= 0 ${IApplicationDestinations::RemoveAllDestinations} $1 '' ${EndIf} ${IUnknown::Release} $1 "" ${EndIf} !macroend ; Unpins a shortcut from Start menu and Taskbar ; ; From https://stackoverflow.com/a/42816728/16993372 !macro UnpinShortcut shortcut !insertmacro ComHlpr_CreateInProcInstance ${CLSID_StartMenuPin} ${IID_IStartMenuPinnedList} r0 "" ${If} $0 P<> 0 System::Call 'SHELL32::SHCreateItemFromParsingName(ws, p0, g "${IID_IShellItem}", *p0r1)' "${shortcut}" ${If} $1 P<> 0 ${IStartMenuPinnedList::RemoveFromList} $0 '(r1)' ${IUnknown::Release} $1 "" ${EndIf} ${IUnknown::Release} $0 "" ${EndIf} !macroend ; Set target path for a .lnk shortcut !macro SetShortcutTarget shortcut target !insertmacro ComHlpr_CreateInProcInstance ${CLSID_ShellLink} ${IID_IShellLink} r0 "" ${If} $0 P<> 0 ${IUnknown::QueryInterface} $0 '("${IID_IPersistFile}",.r1)' ${If} $1 P<> 0 ${IPersistFile::Load} $1 '("${shortcut}", ${STGM_READWRITE})' ${IShellLink::SetPath} $0 '(w "${target}")' ${IPersistFile::Save} $1 '("${shortcut}",1)' ${IUnknown::Release} $1 "" ${EndIf} ${IUnknown::Release} $0 "" ${EndIf} !macroend !define /ifndef MAX_PATH 260 !define /ifndef SLGP_RAWPATH 0x4 ; Test if a .lnk shortcut's target is target, ; use Pop to get the result, 1 is yes, 0 is no, ; note that this macro modifies $0, $1, $2, $3 ; ; Exmaple usage: ; !insertmacro "IsShortCutTarget" "C:\Users\Public\Desktop\App.lnk" "C:\Program Files\App\App.exe" ; Pop $0 ; ${If} $0 = 1 ; MessageBox MB_OK "shortcut target matches" ; ${EndIf} !macro IsShortcutTarget shortcut target ; $0: IShellLink ; $1: IPersistFile ; $2: Target path ; $3: Return value StrCpy $3 0 !insertmacro ComHlpr_CreateInProcInstance ${CLSID_ShellLink} ${IID_IShellLink} r0 "" ${If} $0 P<> 0 ${IUnknown::QueryInterface} $0 '("${IID_IPersistFile}", .r1)' ${If} $1 P<> 0 ${IPersistFile::Load} $1 '("${shortcut}", ${STGM_READ})' System::Alloc MAX_PATH Pop $2 ${IShellLink::GetPath} $0 '(.r2, ${MAX_PATH}, 0, ${SLGP_RAWPATH})' ${If} $2 == "${target}" StrCpy $3 1 ${EndIf} System::Free $2 ${IUnknown::Release} $1 "" ${EndIf} ${IUnknown::Release} $0 "" ${EndIf} Push $3 !macroend