Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I make a Click-once deployed app run at startup?

Tags:

How can I make a Click-once deployed app run a startup?

The best option I found by searching was to set the Publisher on the app to Startup, so the Start menu shortcut would be placed in the Startup folder, but that seems like a huge hack and I would like there to be a Start menu icon people can find.

What options do I have?

like image 597
Eric Haskins Avatar asked Dec 30 '08 23:12

Eric Haskins


People also ask

How do I deploy one click application?

In the Specific target page, select ClickOnce. Enter a path or select Browse to select the publish location. In the Install location page, select where users will install the application from. In the Settings page, you can provide the settings necessary for ClickOnce.

What is ClickOnce deployment?

ClickOnce is a deployment technology that enables you to create self-updating Windows-based applications that can be installed and run with minimal user interaction.

Is ClickOnce still supported?

ClickOnce and DirectInvoke in Microsoft Edge | Microsoft Learn. This browser is no longer supported. Upgrade to Microsoft Edge to take advantage of the latest features, security updates, and technical support.


2 Answers

I feel that adding your application to the startup folder is unprofessional. I strongly recommend using a startup registry key to launch your application.

Contrary to what a lot of the material on this topic says, it is extremely simple to setup a key to launch a click once application and does not require setting up additional shortcuts. You simply use the shortcut created on install:

// The path to the key where Windows looks for startup applications RegistryKey rkApp = Registry.CurrentUser.OpenSubKey(                     @"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", true);  //Path to launch shortcut string startPath = Environment.GetFolderPath(Environment.SpecialFolder.Programs)                     + @"\YourPublisher\YourSuite\YourProduct.appref-ms";  rkApp.SetValue("YourProduct", startPath); 
like image 198
Don Scott Avatar answered Oct 25 '22 11:10

Don Scott


After reading all the comments on this thread and the johnnycoder blog post mentioned above, I came up with a solution that:

  1. Adds your ClickOnce app to the Startup folder
  2. Removes the Startup item automatically when the ClickOnce app is uninstalled (after a reboot or log out/log in)
  3. Was tested and works on Windows XP, Windows 7, Windows Server 2000/2003, Windows 8

My Solution

Basically, your app will be writing a .bat file to the Startup folder that launches the ClickOnce app for you. The .bat file is smart enough to detect if the app has been uninstalled and will delete itself if the ClickOnce app cannot be found.

Step 1

Get the batch file working. Replace PUBLISHER_NAME and APPLICATION_NAME with the right values. You can find them by installing your ClickOnce app, then following the path to it on your file system:

@echo off  IF EXIST "%appdata%\Microsoft\Windows\Start Menu\Programs\PUBLISHER_NAME\APPLICATION_NAME.appref-ms" ( "%appdata%\Microsoft\Windows\Start Menu\Programs\PUBLISHER_NAME\APPLICATION_NAME.appref-ms" ) ELSE (start /b "" cmd /c del "%~f0"&exit /b) 

The batch file will check if your ClickOnce app is installed (by seeing if the appref-ms file exists) and launch it if so. Otherwise, the batch file deletes itself, via a method outlined here.

Now that you have the batch file, test it out. Drop it in your Startup folder to make sure it launches your app on login.

Step 2

Now, in the code for your app, you need to write this batch file to the Startup folder. Here is an example using the batch file above in C# (note that there is some escaping, and environment variable voodoo happening):

string[] mystrings = new string[] { @"@echo off  IF EXIST ""%appdata%\Microsoft\Windows\Start Menu\Programs\PUBLISHER_NAME\APPLICATION_NAME.appref-ms"" ( ""%appdata%\Microsoft\Windows\Start Menu\Programs\PUBLISHER_NAME\APPLICATION_NAME.appref-ms"" ) ELSE (start /b """" cmd /c del ""%~f0""&exit /b)"};  string fullPath = "%appdata%\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\StartMyClickOnceApp.bat";  //Expands the %appdata% path and writes the file to the Startup folder System.IO.File.WriteAllLines(Environment.ExpandEnvironmentVariables(fullPath), mystrings); 

There you have it. Comments / improvements welcomed.

EDIT: Fixed quotes in step 2

like image 25
DiscDev Avatar answered Oct 25 '22 09:10

DiscDev