web-dev-qa-db-fra.com

Comment définir un programme à lancer au démarrage

J'ai une petite application avec une option CheckBox que l'utilisateur peut définir s'il souhaite que l'application démarre avec Windows.

Ma question est de savoir comment configurer l'application pour qu'elle s'exécute au démarrage.

ps: J'utilise C # avec .NET 2.0.

63
Spidey

Plusieurs options, par ordre de préférence:

  1. Ajoutez-le au dossier de démarrage de l'utilisateur actuel. Cela nécessite le moins d'autorisations pour que votre application s'exécute et donne à l'utilisateur le plus de contrôle et de retour d'informations sur ce qui se passe. L'inconvénient est qu'il est un peu plus difficile de déterminer s'il faut afficher la case déjà cochée lors de la prochaine visualisation de cet écran dans votre programme.
  2. Ajoutez-le à la clé de registre HKey_Current_User\Software\Microsoft\Windows\CurrentVersion\Run. Le seul problème ici est qu'il nécessite un accès en écriture au registre, qui n'est pas toujours disponible.
  3. Créer une tâche planifiée qui se déclenche lors de la connexion de l'utilisateur
  4. Ajoutez-le à la clé de registre HKey_Local_Machine\Software\Microsoft\Windows\CurrentVersion\Run. Le seul problème ici est qu'il nécessite un accès en écriture au registre, qui n'est pas toujours disponible.
  5. Configurez-le en tant que service Windows. Ne le faites que si vraiment le pensiez bien, et vous savez bien que vous voulez exécuter ce programme pour tous les utilisateurs de l'ordinateur.

Cette réponse est plus ancienne maintenant. Depuis que j'ai écrit ceci, Windows 10 est sorti, ce qui modifie le fonctionnement des dossiers du menu Démarrer ... y compris le dossier Startup. Je ne sais pas encore à quel point il est facile d'ajouter ou de supprimer un fichier dans ce dossier sans faire également référence à la base de données interne que Windows utilise pour ces emplacements.

100
Joel Coehoorn

Merci à tous d'avoir répondu aussi rapidement ... Joel, j'ai utilisé votre option 2 et ajouté une clé de registre dans le dossier "Exécuter" de l'utilisateur actuel ........ Voici le code que j'ai utilisé pour tous les autres intéressés.

    using Microsoft.Win32;
    private void SetStartup()
    {
        RegistryKey rk = Registry.CurrentUser.OpenSubKey
            ("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);

        if (chkStartUp.Checked)
            rk.SetValue(AppName, Application.ExecutablePath);
        else
            rk.DeleteValue(AppName,false);            

    }
118
Spidey

Vous devez définir une clé de registre, généralement avec votre programme d'installation. Voir http://www.windowsdevcenter.com/pub/a/oreilly/windows/ron/startup_0401.html pour une visite complète. 

10
Justin R.

Vous pouvez créer une entrée de registre dans "HKCU\Software\Microsoft\Windows\CurrentVersion\Run", sachez toutefois que cela peut fonctionner différemment sous Vista. Votre paramètre peut être "virtualisé" à cause du contrôle de compte d'utilisateur.

5
Jon Tackabury

Si une application est conçue pour démarrer au démarrage de Windows (par opposition à la connexion d’un utilisateur), votre seule option est d’impliquer un service Windows. Ecrivez l’application en tant que service ou écrivez un service simple qui existe uniquement pour lancer l’application.

La rédaction de services peut être délicate et peut imposer des restrictions inacceptables dans votre cas particulier. Un modèle de conception courant est une paire front-end/back-end, avec un service qui fait le travail et un frontal d'application qui communique avec le service pour afficher des informations à l'utilisateur.

D'autre part, si vous souhaitez simplement que votre application démarre à la connexion de l'utilisateur, vous pouvez utiliser les méthodes 1 ou 2 répertoriées par Joel Coehoorn.

3
Harper Shelby

Voici tous les moyens d’ajouter votre programme au démarrage pour Windows Vista, 7, 8, 10

  • Chemin du fichier

C:\Users\Bureau Briffault\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup (Visible à partir du gestionnaire de tâches, en cours d'exécution avec succès connexion réussie, aucun privilège d'administrateur requis)

C:\Users\Default\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup (visible à partir du gestionnaire de tâches, s'exécutant sur tous les utilisateurs succès de la connexion, privilèges d'administrateur requis)


  • Chemin du registre

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run (Visible à partir du gestionnaire de tâches, en cours d'exécution en cas de connexion réussie de l'utilisateur actuel, privilèges No Admin requis)

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce (Non visible à partir du gestionnaire de tâches, en cours d'exécution en cas de connexion réussie de l'utilisateur actuel, Exécution d'une session unique, aucun privilège d'administrateur requis)

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run (Visible à partir du gestionnaire de tâches, en cours d'exécution en cas de réussite de la connexion de l'utilisateur, privilèges Admin Requis)

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce (Non visible à partir du gestionnaire de tâches, en cours d'exécution lorsque tous les utilisateurs se sont connectés, Exécution d'une session unique, privilèges d'administrateur requis)


  • Planificateur de tâches

Microsoft.Win32.Taskscheduler.dll (Non visible à partir du gestionnaire de tâches, Exécution au démarrage de Windows, Exécution en tant qu'administrateur, privilèges d'administrateur requis)

3
Xepher Dotcom
    /// <summary>
    /// Add application to Startup of windows
    /// </summary>
    /// <param name="appName"></param>
    /// <param name="path"></param>
    public static void AddStartup(string appName, string path)
    {
        using (RegistryKey key = Registry.CurrentUser.OpenSubKey
            ("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true))
        {
            key.SetValue(appName, "\"" + path + "\"");
        }
    }

    /// <summary>
    /// Remove application from Startup of windows
    /// </summary>
    /// <param name="appName"></param>
    public static void RemoveStartup(string appName)
    {
        using (RegistryKey key = Registry.CurrentUser.OpenSubKey
            ("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true))
        {
            key.DeleteValue(appName, false);
        }
    }
1
INS software

J'ai trouvé l'ajout d'un raccourci au dossier de démarrage était le moyen le plus simple pour moi. J'ai dû ajouter une référence à "Modèle d'objet hôte de script Windows" et "Microsoft.CSharp", puis utilisé ce code:

IWshRuntimeLibrary.WshShell Shell = new IWshRuntimeLibrary.WshShell();
string shortcutAddress = Environment.GetFolderPath(Environment.SpecialFolder.Startup) + @"\MyAppName.lnk";
System.Reflection.Assembly curAssembly = System.Reflection.Assembly.GetExecutingAssembly();

IWshRuntimeLibrary.IWshShortcut shortcut = (IWshRuntimeLibrary.IWshShortcut)Shell.CreateShortcut(shortcutAddress);
shortcut.Description = "My App Name";
shortcut.WorkingDirectory = AppDomain.CurrentDomain.BaseDirectory;
shortcut.TargetPath = curAssembly.Location;
shortcut.IconLocation = AppDomain.CurrentDomain.BaseDirectory + @"MyIconName.ico";
shortcut.Save();
1
gcdev

C'est une solution si simple:

Ajouter

Microsoft.Win32.RegistryKey key = Microsoft.Win32.Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);
key.SetValue("Your Application Name", Application.ExecutablePath);

Retirer

Microsoft.Win32.RegistryKey key = Microsoft.Win32.Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);
key.DeleteValue("Your Application Name", false);
1

Vous pouvez le faire avec la classe win32 dans l'espace de noms Microsoft.

using Microsoft.Win32;

using (RegistryKey key = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true))
 {
            key.SetValue("aldwin", "\"" + Application.ExecutablePath + "\"");
 }
0
Aldwin Nunag

En plus de la réponse de Xepher Dotcom, le chemin du dossier de démarrage de Windows devrait être codé comme suit:

var Startup = Environment.GetFolderPath(Environment.SpecialFolder.Startup);
0
Krzysiek