Frage

Wie kann ich eine klicker-bereitgestellte App ein Start ausführen?

Die beste Option, die ich bei der Suche gefunden habe, war, den Verlag in der App auf das Start zu setzen, damit die Startmenü -Verknüpfung in den Startordner platziert wird, aber das scheint ein großer Hack zu finden können.

Welche Optionen habe ich?

War es hilfreich?

Lösung

Ich bin der Meinung, dass das Hinzufügen Ihrer Anwendung zum Startordner unprofessionell ist. Ich empfehle dringend, einen Start -up -Registrierungsschlüssel zu verwenden, um Ihre Bewerbung zu starten.

Im Gegensatz zu dem, was ein Großteil des Materials zu diesem Thema sagt, ist es äußerst einfach, einen Schlüssel einzurichten, um einen Klick zu starten, der einmal die Anwendung startet und keine zusätzlichen Verknüpfungen einrichten muss. Sie verwenden einfach die Verknüpfung, die bei der Installation erstellt wurde:

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

Andere Tipps

Nach dem Lesen aller Kommentare zu diesem Thread und der Johnnycoder -Blog -Beitrag oben erwähnt, Ich habe eine Lösung gefunden, die:

  1. Fügt Ihre Clickonce -App dem Startordner hinzu
  2. Entfernt das Startelement automatisch, wenn die ClickOnce -App deinstalliert ist (nach einem Neustart oder Anmelden/Anmeldung)
  3. Wurde getestet und funktioniert unter Windows XP, Windows 7, Windows Server 2000/2003, Windows 8

Meine Lösung

Grundsätzlich wird Ihre App a schreiben .bat Datei zum Startordner, in dem die ClickOnce -App für Sie gestartet wird. Das .bat Die Datei ist klug genug, um festzustellen, ob die App deinstalliert wurde, und löscht sich selbst, wenn die ClickOnce -App nicht gefunden werden kann.

Schritt 1

Lassen Sie die Batch -Datei funktionieren. Ersetzen Sie Publisher_Name und Application_Name durch die richtigen Werte. Sie können sie finden, indem Sie Ihre ClickOnce -App installieren und dann dem Pfad in Ihr Dateisystem folgen:

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

In der Batch-Datei wird überprüft, ob Ihre ClickOnce-App installiert ist (indem Sie feststellen, ob die Appref-MS-Datei vorliegt) und starten Sie sie, wenn ja. Andernfalls löscht sich die Stapeldatei über eine Methode über eine Methode hier skizziert.

Nachdem Sie die Batch -Datei haben, testen Sie sie aus. Lassen Sie es in Ihren Startordner fallen, um sicherzustellen, dass Ihre App auf Login gestartet wird.

Schritt 2

In dem Code für Ihre App müssen Sie diese Stapeldatei in den Startordner schreiben. Hier ist ein Beispiel, bei dem die obige Batch -Datei in C# verwendet wird (beachten Sie, dass ein Flucht und eine Umgebungsvariable -Voodoo stattfindet):

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

Hier hast du es. Kommentare / Verbesserungen begrüßt.

Bearbeiten: Feste Anführungszeichen in Schritt 2

All diese Tricks funktionieren leider nicht auf Vista. Vista blockiert diese Programme aus irgendeinem Grund zu Startup.

Wie von @thijs vorgeschlagen, können Sie die "Sicherheit" von Vista in diesem Fall leicht umgehen. Siehe Blogpost on So führen Sie ClickOnce -Apps im Windows -Start aus.

Nun, es gibt eine Reihe von Möglichkeiten, um Ihre Anwendung beim Start zu starten, aber es gibt ein Aufräumproblem. Selbst wenn Sie den Start -up -Registrierungsschlüssel verwenden und es gut aussieht, sollten Sie alles reinigen, was Sie zu diesem System hinzugefügt haben. Sie können einen Blick auf meinen Artikel werfen, ich habe das gleiche Problem mit dem gleichen Reinigungsproblem vorhanden und benutzte Automatisierungs- und Cutom -Deinstall -Datei, um das Problem zu lösen.

Danke Discdev und Dbenham. Die Lösung funktioniert großartig. Ich wollte nur den aktualisierten Arbeitscode basierend auf dem neuesten von Dbenham teilen.

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

Zunächst einmal danke für die Antwort Discdev. Damit dies mit Å ä ö und anderen Sonderzeichen funktioniert, hat diese Modifikation es für mich mit UTF-8 eine andere Code-Seite und keine BOM gemacht.

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

Um die Anwendung beim Start zu starten, ist es die beste Wahl, einen Link im Startordner zu haben. Oder falls nicht der Startordner, dann die Start -Reg -Taste.

Eine Möglichkeit, das Symbol nicht in der normalen Position zu haben, besteht darin, dass die Anwendung einen Link zu sich selbst in den Startordner beim Anwendungsstart platziert. ClickOnce -Apps werden beim ersten Installieren ausgeführt. Die Anwendung kann dieses Start verwenden, um einen Link im Startordner zu platzieren. Jetzt wird der Link an beiden Orten sein und Sie sollten golden sein.

Es gibt jedoch das Problem, dass das Löschen der ClickOnce -App sie nun nicht mehr löscht. ClickOnce verfolgt nicht den hinzugefügten manuellen Link und daher jedes Mal, wenn jemand Ihre App nicht installiert und neu startet, wird sie erneut installiert. Ich würde anfangen, dieses Programm zu überlegen, um mich nicht gut zu verhalten :(.

Sie können Ihre App zum Start -Taste "Ausführen" Start -Registrierung hinzufügen. Obwohl Sie es nicht entfernen können, wenn Ihre App gelöscht wird, schadet sie nichts und niemand wird die kaputte Referenz sehen.

Für den Fall, dass es jemand anderem hilft, immer noch nach einer Lösung zu suchen, einen Kommentar auf dem Boden hinunter http://johnnycoder.com/blog/2009/02/24/clickonce-run-at-startup/ Schlägt vor, die ClickOnce -Veröffentlichungsoptionen (in Vs.NET 2010, die sich auf den Projekteigenschaften, den Veröffentlichungsbildschirm und den Optionen zu veröffentlichen) festlegen, wobei der Publisher -Name auf Startup und Suite -Name gelassen wurde. Dadurch wird die Programmverknüpfung für mich unter Windows 7 in den Startordner eingerichtet. Ich weiß nicht, was andere Versionen von Windows tun.

Aus irgendeinem Grund würde Windows meine App (die Datei ".Appref-MS") bei der Anmeldung nicht starten. Also habe ich eine Lösung gefunden, die andere möglicherweise auch hilfreich finden.

Wenn meine App zum ersten Mal installiert ist (und beim Start meiner App), füge/prüe ich, ob meine Anwendungen der aktuelle Standort string.Concat(Application.ExecutablePath, " ", "/startup") existiert im Register "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run". Wenn die Anwendung dann beginnt, überprüfe ich die Args auf "/starten" und federn Sie den folgenden Code aus.

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.

Das hat großartig für mich funktioniert. Aber wenn Sie das nur hinzufügen Application.ExecutablePath Wert für die Registrierung ohne die "/startup" Argumentation, die Anwendung beginnt, wenn Windows startet, jedoch nicht im Kontext einer Anwendung "Klicken Sie einmal". Dadurch können Sie nicht Zugriff haben ApplicationDeployment.CurrentDeployment. Obwohl dies großartig funktioniert hat, besteht das Problem immer noch, dass die Einstellung der Registrierung, wenn meine Bewerbung deinstalliert ist, nicht entfernt wird. Dies kann durch Verwendung fixiert werden @Ivan Leonenko Benutzerdefinierte Deinstallationslösung. Hoffe das hilft...

Ich mache das und arbeite für mich

 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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top