Wie stelle ich ein Programm ein, das beim Start gestartet werden soll?

75

Ich habe eine kleine Anwendung mit einer CheckBoxOption, die der Benutzer festlegen kann, wenn die App mit Windows gestartet werden soll.

Meine Frage ist, wie ich die App tatsächlich so einstelle, dass sie beim Start ausgeführt wird.

ps: Ich verwende C # mit .NET 2.0.

Spidey
quelle
1
Wenn Ihre Anwendung beim Start zeitaufwändig oder ressourcenintensiv ist, z. B. im Internet nach Updates suchen, sollten Sie einen Timer implementieren, damit Ihr Programm nach dem Start etwas ausgeführt wird. Eines meiner Lieblingsprobleme sind etwa ein Dutzend Programme auf meinem Computer, die alles zum Crawlen ziehen, während alle beim Start nach Updates suchen (ja, ich sehe Sie, iTunes und Java besonders an).
Dana Robinson

Antworten:

107

Verschiedene Optionen in der Reihenfolge ihrer Präferenz:

  1. Fügen Sie es dem Startordner des aktuellen Benutzers hinzu. Dies erfordert die geringsten Berechtigungen für die Ausführung Ihrer App und gibt dem Benutzer die größte Kontrolle und Rückmeldung darüber, was gerade passiert. Der Nachteil ist, dass es etwas schwieriger ist zu bestimmen, ob das Kontrollkästchen angezeigt werden soll, das beim nächsten Anzeigen dieses Bildschirms in Ihrem Programm bereits aktiviert ist.
  2. Fügen Sie es dem HKey_Current_User\Software\Microsoft\Windows\CurrentVersion\RunRegistrierungsschlüssel hinzu. Das einzige Problem hierbei ist, dass Schreibzugriff auf die Registrierung erforderlich ist, die nicht immer verfügbar ist.
  3. Erstellen Sie eine geplante Aufgabe, die bei der Benutzeranmeldung ausgelöst wird
  4. Fügen Sie es dem HKey_Local_Machine\Software\Microsoft\Windows\CurrentVersion\RunRegistrierungsschlüssel hinzu. Das einzige Problem hierbei ist, dass Schreibzugriff auf die Registrierung erforderlich ist, die nicht immer verfügbar ist.
  5. Richten Sie es als Windows-Dienst ein. Tun Sie dies nur, wenn Sie es ernst meinen und sicher wissen, dass Sie dieses Programm für alle Benutzer auf dem Computer ausführen möchten .

Diese Antwort ist jetzt älter. Seit ich dies geschrieben habe, wurde Windows 10 veröffentlicht, das die Funktionsweise der Ordner im Startmenü ändert ... einschließlich des StartupOrdners. Mir ist noch nicht klar, wie einfach es ist, eine Datei in diesem Ordner hinzuzufügen oder zu entfernen, ohne auch auf die interne Datenbank zu verweisen, die Windows für diese Speicherorte verwendet.

Joel Coehoorn
quelle
Es gibt Verzeichnisse und Registrierungsschlüssel für den aktuellen Benutzer und für alle Benutzer. Entscheiden Sie, was Sie für Ihre Bewerbung benötigen.
Michael Piendl
Vielen Dank an alle, die so schnell reagiert haben. Joel Ich ging mit dir Option 2.
Spidey
Windows-Dienst ja, aber Sie müssen die Anwendung mit der Option Als Benutzer ausgeben ausführen. Wenn nicht, wird das Programm nur einmal und in der Systemsitzung gestartet.
Patrik
Welche Berechtigungen sehen wir für Nummer 2? Ich habe es mit maximaler Benutzerkontensteuerung unter Win 7 versucht und es warnte vor nichts.
Dan W
@ Joel in welchen Szenarien haben Sie keinen Schreibzugriff auf HKCU? Ich denke, sogar ein Gastbenutzer kann diesen Registrierungsstock schreiben
Ricardo Polo Jaramillo
128

Vielen Dank an alle, die so schnell reagiert haben. Joel, ich habe Ihre Option 2 verwendet und dem Ordner "Ausführen" des aktuellen Benutzers einen Registrierungsschlüssel hinzugefügt. Hier ist der Code, den ich für alle anderen Interessierten verwendet habe.

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

    }
Spidey
quelle
3
Was ist die Variable chkStartUp?
Fernando Santiago
5
Ich weiß, dass ich zu spät komme, @fernado Santiago, aber es ist sein Kontrollkästchen, mit dem der Benutzer das Programm zum Start hinzufügen oder daraus entfernen kann.
Steve Byrne
1
Dies ist für mich nicht hilfreich, es gibt mir Berechtigungsfehler. Gibt es eine Möglichkeit, Berechtigungen manuell zu übernehmen und sie dann freizugeben?
Jamshaid Kamran
2
was ist AppName?
Mrid
1
@mrid AppName ist nur ein Platzhalter. Im Wesentlichen ist es im String-Format. Ersetzen Sie einfach AppName durch "Der Name Ihrer Anwendung".
Mark
11

Hier finden Sie alle Möglichkeiten, um Ihr Programm zum Start für Windows Vista, 7, 8, 10 hinzuzufügen

  • Dateipfad

C:\Users\Bureau Briffault\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup (Sichtbar im Task-Manager. Wird bei aktuellem Benutzeranmeldeerfolg ausgeführt. Keine Administratorrechte erforderlich.)

C:\Users\Default\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup (Sichtbar im Task-Manager. Wird bei allen erfolgreichen Benutzeranmeldungen ausgeführt. Erforderliche Administratorrechte.)


  • Registrierungspfad

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run (Sichtbar über den Task-Manager. Wird bei aktuellem Benutzeranmeldeerfolg ausgeführt. Keine Administratorrechte erforderlich.)

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce (Im Task-Manager nicht sichtbar. Wird bei aktuellem Benutzeranmeldeerfolg ausgeführt. Wird für eine Anmeldezeit ausgeführt. Keine Administratorrechte erforderlich.)

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run (Sichtbar im Task-Manager. Wird bei allen erfolgreichen Benutzeranmeldungen ausgeführt. Erforderliche Administratorrechte.)

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce (Im Task-Manager nicht sichtbar. Wird bei allen Benutzeranmeldeerfolgen ausgeführt. Wird für eine Anmeldezeit ausgeführt. Administratorrechte erforderlich.)


  • Taskplaner

Microsoft.Win32.Taskscheduler.dll (Im Task-Manager nicht sichtbar, Wird unter Windows ausgeführt, Als Administrator ausgeführt, Administratorrechte erforderlich.)

Xepher Dotcom
quelle
Ich habe dies verwendet, um einen Weblogic-Server zu starten, und Taks Scheduler schien der beste Weg zu sein, da wir uns nicht bei Windows anmelden wollten, um den Server zu starten. Zu beachten ist jedoch, dass die Prozesse im Task-Manager während der Ausführung als Administrator sichtbar waren und auch keine UIangezeigt wurden. aber der Server lief immer noch gut. (Windows Server 2016)
Niklas
@OP Sie haben eine Option vergessen - Erstellen eines Windows-Dienstes, der das Programm beim Start startet: stackoverflow.com/a/15719678/2441655
Venryx
5

Sie können einen Registrierungseintrag unter "HKCU \ Software \ Microsoft \ Windows \ CurrentVersion \ Run" erstellen. Beachten Sie jedoch, dass dies unter Vista möglicherweise anders funktioniert. Ihre Einstellung wird möglicherweise aufgrund der Benutzerkontensteuerung "virtualisiert".

Jon Tackabury
quelle
5

Zusätzlich zur Antwort von Xepher Dotcom sollte der Ordnerpfad zum Windows-Start folgendermaßen codiert werden:

var Startup = Environment.GetFolderPath(Environment.SpecialFolder.Startup);
Krzysiek
quelle
4

Es ist eine so einfache Lösung:

Hinzufügen

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

Zu entfernen

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

Wenn eine Anwendung so konzipiert ist, dass sie beim Start von Windows gestartet wird (im Gegensatz zur Anmeldung eines Benutzers), können Sie nur einen Windows-Dienst einbeziehen. Schreiben Sie die Anwendung entweder als Dienst oder schreiben Sie einen einfachen Dienst, der nur zum Starten der Anwendung vorhanden ist.

Schreibdienste können schwierig sein und Einschränkungen auferlegen, die für Ihren speziellen Fall möglicherweise nicht akzeptabel sind. Ein gängiges Entwurfsmuster ist ein Front-End / Back-End-Paar mit einem Dienst, der die Arbeit erledigt, und einem Anwendungs-Front-End, das mit dem Dienst kommuniziert, um dem Benutzer Informationen anzuzeigen.

Wenn Sie jedoch nur möchten, dass Ihre Anwendung bei der Benutzeranmeldung gestartet wird, können Sie die von Joel Coehoorn aufgelisteten Methoden 1 oder 2 verwenden.

Harper Shelby
quelle
Mit dem Dienstprogramm NSSM können Sie eine beliebige Anwendung als Dienst ausführen.
Mike Rosoft
1
    /// <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);
        }
    }
INS-Software
quelle
1

Ich fand das Hinzufügen einer Verknüpfung zum Startordner der einfachste Weg für mich. Ich musste einen Verweis auf "Windows Script Host Object Model" und "Microsoft.CSharp" hinzufügen und verwendete dann diesen 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();
gcdev
quelle
0

Sie können dies mit der win32-Klasse im Microsoft-Namespace tun

using Microsoft.Win32;

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