Comment puis-je faire en sorte qu'une application déployée Click-Once s'exécute au démarrage?

StackOverflow https://stackoverflow.com/questions/401816

  •  03-07-2019
  •  | 
  •  

Question

Comment puis-je faire en sorte qu'une application déployée Click-Once s'exécute au démarrage?

La meilleure option que j’ai trouvée en recherchant consistait à définir le serveur de publication de l’application sur Démarrage, de sorte que le raccourci du menu Démarrer soit placé dans le dossier Démarrage. icône de menu les gens peuvent trouver.

Quelles sont mes options?

Était-ce utile?

La solution

J’estime qu’ajouter votre application au dossier de démarrage n’est pas professionnel. Je recommande fortement d'utiliser une clé de registre de démarrage pour lancer votre application.

Contrairement à ce que disent de nombreux documents sur ce sujet, il est extrêmement simple de configurer une clé pour lancer une application clic une fois et ne nécessite pas la configuration de raccourcis supplémentaires. Vous utilisez simplement le raccourci créé lors de l’installation:

// 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);

Autres conseils

Après avoir lu tous les commentaires sur ce fil et le johnnycoder blog post mentionné ci-dessus , je suis venu avec une solution qui:

  1. Ajoute votre application ClickOnce au dossier de démarrage
  2. Supprime l'élément de démarrage automatiquement lorsque l'application ClickOnce est désinstallée (après un redémarrage ou une déconnexion / connexion)
  3. A été testé et fonctionne sous Windows XP, Windows 7, Windows Server 2000/2003, Windows 8

Ma solution

Fondamentalement, votre application écrira un fichier .bat dans le dossier de démarrage qui lance l'application ClickOnce à votre place. Le fichier .bat est suffisamment intelligent pour détecter si l'application a été désinstallée et va se supprimer si l'application ClickOnce est introuvable.

Étape 1

Faites fonctionner le fichier de commandes. Remplacez PUBLISHER_NAME et APPLICATION_NAME par les bonnes valeurs. Vous pouvez les trouver en installant votre application ClickOnce, puis en suivant son chemin sur votre système de fichiers:

@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)

Le fichier de commandes vérifiera si votre application ClickOnce est installée (en vérifiant si le fichier appref-ms existe) et le lancera le cas échéant. Sinon, le fichier de commandes se supprime lui-même, via une méthode décrite ici .

Maintenant que vous avez le fichier de commandes, testez-le. Déposez-le dans votre dossier de démarrage pour vous assurer qu'il lance votre application lors de la connexion.

Étape 2

Désormais, dans le code de votre application, vous devez écrire ce fichier de traitement par lots dans le dossier de démarrage. Voici un exemple d'utilisation du fichier de commandes ci-dessus en C # (notez qu'il y a des échappements et que la variable d'environnement vaudou se passe):

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);

Voilà. Commentaires / améliorations bienvenus.

EDIT: guillemets fixes à l'étape 2

Toutes ces astuces ne fonctionnent malheureusement pas sur Vista. Vista bloque ces programmes au démarrage pour une raison quelconque.

Comme suggéré par @thijs, vous pouvez facilement contourner la "sécurité" de vista. sur celui-ci. Voir blogpost sur comment exécuter des applications clickonce au démarrage de Windows .

Bien, il existe plusieurs façons de lancer votre application au démarrage, mais il y a un problème de nettoyage. Même si vous utilisez la clé de registre de démarrage et que tout se passe bien, vous devez de toute façon nettoyer tout ce que vous avez ajouté au système. Vous pouvez jeter un coup d'oeil sur mon article, j'ai été confronté au même résoudre le problème.

Merci DiscDev et dbenham. La solution fonctionne très bien. Je voulais juste partager le code de travail mis à jour basé sur le dernier de dbenham.

 const string fullPathEnvVar =
            "%appdata%\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\StartMyClickOnceApp.bat";
 //Expands the %appdata% path
 string fullPath = Environment.ExpandEnvironmentVariables(fullPathEnvVar);

if (!File.Exists(fullPath))
        {
            string[] mystrings =
            {
                @"@echo off 
if exist ""%appdata%\Microsoft\Windows\Start Menu\Programs\<PublisherName>\<ApplicationName>.appref-ms"" (
""%appdata%\Microsoft\Windows\Start Menu\Programs\<PublisherName>\<ApplicationName>.appref-ms""
) else (
(goto) 2>nul & del ""%~f0""
)"
            };
            //write the file to the Startup folder
            File.WriteAllLines(fullPath, mystrings);
        }

Tout d’abord, merci pour la réponse Discdev. Pour que cela fonctionne avec Å Ä Ö et avec d'autres caractères spéciaux, cette modification l'a été pour moi, en utilisant UTF-8, une page de code différente et aucune nomenclature.

string[] mystrings = new string[] { "chcp 65001", @"IF EXIST ""%appdata%\Microsoft\Windows\Start Menu\Programs\<Publisher>\<App_Name>.appref-ms"" (""%appdata%\Microsoft\Windows\Start Menu\Programs\<Publisher>\<App_Name>.appref-ms"") ELSE (start /b """" cmd /c del ""%~f0""&exit /b)" };
string fullPath = "%appdata%\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\StartErrandDynamicMenu.bat";
System.Text.Encoding utf8WithoutBOM = new System.Text.UTF8Encoding(false);
System.IO.File.WriteAllLines(Environment.ExpandEnvironmentVariables(fullPath), mystrings, utf8WithoutBOM);

Pour que l'application soit réellement lancée au démarrage, il est préférable d'avoir un lien dans le dossier de démarrage. Ou si ce n'est pas le dossier de démarrage, la clé reg de démarrage.

Pour éviter le fait que l’icône soit dans sa position normale, l’application doit placer un lien vers elle-même dans le dossier de démarrage au démarrage de l’application. Les applications ClickOnce seront exécutées lors de la première installation. L'application peut utiliser ce démarrage pour placer un lien dans le dossier Démarrage. Maintenant, le lien sera aux deux endroits et vous devriez être en or.

Il existe toutefois un problème, à savoir que supprimer maintenant l'application ClickOnce ne le supprimera plus réellement. ClickOnce ne suivra pas le lien manuel ajouté. Par conséquent, chaque fois que quelqu'un désinstallera votre application et le redémarrera, elle sera réinstallée. Je commencerais par considérer que ce programme ne se comportait pas bien :(.

Vous pouvez ajouter votre application au fichier " Exécuter " approprié. clé de registre de démarrage au démarrage. Ensuite, même si vous ne pouvez pas le supprimer lorsque votre application est supprimée, rien ne fera mal et personne ne verra la référence brisée.

Au cas où cela aiderait ceux qui recherchent une solution à ce problème, placez-y un commentaire http://johnnycoder.com/blog/2009/02/24/clickonce-run-at-startup/ suggère de définir les options de publication ClickOnce (dans VS.Net 2010 activé). les propriétés du projet, l'écran de publication et les options) avec le nom de l'éditeur défini sur Démarrage et le nom de la suite laissé vide. Cela me permet d’obtenir le raccourci du programme dans le dossier de démarrage de Windows 7. Je ne sais pas ce que les autres versions de Windows font.

Pour une raison quelconque, Windows ne démarre pas mon application (le fichier ".appref-ms") lors de la connexion. J'ai donc proposé une solution que d'autres trouveraient peut-être utile.

Lorsque mon application est installée pour la première fois (et au démarrage de mon application), j'ajoute / vérifie que l'emplacement actuel de mes applications string.Concat (Application.ExecutablePath, """, "/" le démarrage ") existe dans le registre " HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Run " <. Lorsque l'application démarre ensuite, je vérifie les arguments de " / startup " et si cela est présent, exécutez le code suivant.

var startMenuFile = Path.Combine("Programs", Company, Product + ".appref-ms");
var startMenuFolder = Environment.GetFolderPath(Environment.SpecialFolder.StartMenu);
var fileName = Path.Combine(startMenuFolder, startMenuFile);

if (File.Exists(fileName))
{
    Process.Start(fileName);
    return;
}

// Log that for some reason, the application doesn't exist.

Cela a très bien fonctionné pour moi. Mais, si vous ajoutez simplement la valeur Application.ExecutablePath au registre sans l'argument "/ startup", l'application démarrera au démarrage de Windows, mais pas dans le contexte de un " clic une fois " application. Cela ne vous autorisera pas à accéder à ApplicationDeployment.CurrentDeployment . Bien que cela ait fonctionné à merveille, le problème persiste lorsque, lors de la désinstallation de mon application, le paramètre de registre n'est pas supprimé. Ce problème peut être résolu en utilisant la solution de désinstallation personnalisée de @Ivan Leonenko . J'espère que ça aide ...

Je fais cela et travaille pour moi

 Sub AddToStartup()
    If My.Application.IsNetworkDeployed Then


        Dim str As String = My.Application.Deployment.UpdatedApplicationFullName.ToString

        Dim saida As String = ""

        For i As Integer = 0 To str.Split(",").Length

            If Not saida.Contains("msil") Then
                saida += str.Split(",")(i) & ", "
            End If
        Next

        If saida.Contains("msil") Then
            saida = saida.Substring(0, saida.Length - 2)
        End If

        Dim name As String = My.Application.Info.Title
        Dim file As String = Path.Combine(My.Application.Info.DirectoryPath, name & ".appref-ms")
        My.Computer.FileSystem.WriteAllText(file, saida, False)

        Dim reg As RegistryKey = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", True)
        reg.SetValue(name, file)

    End If


End Sub
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top