Windows 10 NSIS uninstaller to also remove notification icon - nsis

I'm working on a windows 10 app but I've noticed that when I uninstall it it's icon remains in the notification & actions window. what would I need to do or add to my uninstaller to allow it to remove this icon. This is what what uninstaller look like in my .nsi script
Section "Uninstall"
Call un.XXXXXXXXX
ExecWait '"$INSTDIR\f2p_ping.exe" --f2p' $0
; Remove registry keys
DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\MyApp"
DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\Run" "MyApp"
DeleteRegValue HKLM "Software\Microsoft\Windows\CurrentVersion\Run" "MyApp"
DeleteRegKey HKLM "SOFTWARE\MyApp"
DeleteRegKey HKCU "Software\MyApp\Overlay\ExcludedProcesses"
DeleteRegKey HKCR "MyApp"
RMDir /r "$INSTDIR"
RMDir /r $PROGRAMFILES\MyApp
RMDir /r "$APPDATA\MyApp\*.*"
; Remove shortcuts, if any
SetShellVarContext current
Delete "$SMPROGRAMS\MyApp\*.*"
Delete "$SMPROGRAMS\Startup\MyApp.lnk"
SetShellVarContext all
Delete "$SMPROGRAMS\MyApp\*.*"
Delete "$SMPROGRAMS\Startup\MyApp.lnk"
Delete "$DESKTOP\MyApp.lnk"
; Remove directories used
SetShellVarContext current
RMDir "$SMPROGRAMS\MyApp"
SetShellVarContext all
RMDir "$SMPROGRAMS\MyApp"
RMDir "$INSTDIR"
SectionEnd

The best solution is probably to have your application hide the notifications since it already contains notification code. Run something like ExecWait '"$InstDir\MyApp.exe" /uninstall' at the start of your uninstaller.
It might be possible to use one of the IToast* interfaces with the System plugin but there is a lot of code needed and I don't know if Windows let's you pretend to be another application by using its Application Model Id. For example, MSDN has this to say about IToastNotificationHistory::Remove:
The app ID of the app that sent the specified toast notification. This app must be part of the same app package as the app making this remove request.
MSDN also has this to say about desktop apps:
Generally, sending a toast notification from a desktop app is the same as sending it from a Windows Store app. However, you should be aware of these differences and requirements:
For a desktop app to display a toast, the app must have a shortcut on the Start screen.
The shortcut must have an AppUserModelID.
Desktop apps cannot schedule a toast.

Related

Deleting the Registry key & values on NSIS

i was trying to delete the regkey key & value by using the following commands(DeleteRegKey,DeleteRegValue),
But in the both cases the registry key & value is not getting deleted. Is there any other way do this activity.
Section test
WriteRegStr HKLM "SOFTWARE\WOW6432Node\Management System\Shared ExchData" \
"DRIVE_MON" "Monday"
DeleteRegKey HKLM "SOFTWARE\WOW6432Node\Management System\Shared ExchData"
DeleteRegValue HKLM "SOFTWARE\WOW6432Node\Management System\Shared ExchData" "DRIVE_MON"
SectionEnd
If your installer is 32-bit then use HKLM "SOFTWARE\Management System\Shared ExchData" to access the 32-bit key.
SetRegView can be used to choose between the 32 & 64 bit views on 64-bit Windows.

Assign HKLM/HKCU to a variable for different types of installs

I'm writing a script to associate file associations, and I'm wondering if it's possible to assign a variable to HKLM or HKCU depending on whether it's an admin or user install. The project I'm working on determines this at run time when the user appends -user for a user install as opposed to an admin install. I was thinking of something like:
Var location
${If} $InstallMode == "Admin"
$location = HKLM ;probably not the right way to assign
${Else}
$location = HKCU
${EndIf}
I'm new to NSIS and from what I've read and tried so far, I can !define a variable to be HKLM or HKCU by writing !define location HKCU but define won't work during runtime.
SHCTX exists for this purpose. It is controlled by SetShellVarContext. The default is the user (HKCU), set to All for HKLM.

ReadRegStr fails

I am trying to use ReadregStr,
ReadRegStr $R0 HKLM "SOFTWARE\MyAPP" "ProgramPath"
But its returning empty string. When I look in the registry entries under HKLM I could see SOFTWARE\MyAPP.
Value Name = ProgramPath
Value Data = C:\MyAPP
Where am I doing wrong. Can any one tell me how to get the installed path of "MyAPP"
If this is 64 bit Windows you need to use Setregview 64, if this value is stored in the virtual store you need to read from HKCU classes\VirtualStore\Machine\Software\...

command AutoCloseWindow not valid in Section

Section userSoftware
MessageBox MB_YESNO|MB_ICONQUESTION "Insert user software DVD in to drive and click Yes to install User Software or click No to Proceed" /SD IDNO IDYES yes IDNO no
yes:
AutoCloseWindow true
SetRebootFlag false
Call installUserSoftware
no:
;do nothing
SectionEnd
Section: "userSoftware"
Error: command AutoCloseWindow not valid in Section
This is the error I am getting with AutoCloseWindow. All I am trying to do is after installing the server software if user selects to install Client software, installation of server software should disappear without asking user to hit finish button.
Code I gave I am just testing how AutoCloseWindow or SetAutoClose works, nut all I have is an error!!
AutoCloseWindow is a property like Name and Installdir and must be placed outside functions and sections. If you want to set the autoclose flag at runtime you must use the SetAutoClose command...

NSIS: Problem reading installdir by InstallDirRegKey

I have a nsi script which starts as following:
Name "myprog"
OutFile "myprog.exe"
InstallDir $PROGRAMFILES32\xx
InstallDirRegKey HKLM "Software\yy\xx" "InstallDir"
RequestExecutionLevel admin
AutoCloseWindow true
BrandingText /TRIMCENTER "me"
LoadLanguageFile "${NSISDIR}\Contrib\Language files\German.nlf"
Caption "Updateprogramm"
It works fine on my dev machine, but not on production (e.g. the user has only readonly permissions for the registry path). It is a Win 2003 server os. Even when the registry key exists, the program tries to install in $PROGRAMFILES32\xx.
InstallDirRegKey only needs read access.
The thing troubling thing for me is that you are talking about read only, but you have "RequestExecutionLevel admin" in your script. This says to me that you require admin rights and when you have "RequestExecutionLevel admin" you also need to use UserInfo::GetAccountType (To handle < NT6 systems and Vista+ when UAC is off)

Resources