Domanda

Come posso fare in modo che un'app distribuita Click-once esegua un avvio?

L'opzione migliore che ho trovato durante la ricerca è stata quella di impostare il Publisher sull'app su Startup, quindi il collegamento al menu Start sarebbe stato inserito nella cartella Startup, ma quello sembra un enorme hack e vorrei che ci fosse un Start icona del menu che le persone possono trovare.

Quali opzioni ho?

È stato utile?

Soluzione

Ritengo che l'aggiunta della tua applicazione alla cartella di avvio non sia professionale. Consiglio vivamente di utilizzare una chiave di registro di avvio per avviare l'applicazione.

Contrariamente a quanto dice molto del materiale su questo argomento, è estremamente semplice impostare un tasto per avviare un clic una volta l'applicazione e non richiede l'impostazione di scorciatoie aggiuntive. È sufficiente utilizzare il collegamento creato durante l'installazione:

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

Altri suggerimenti

Dopo aver letto tutti i commenti su questa discussione e sul post sul blog di johnnycoder menzionato sopra , ho trovato una soluzione che:

  1. Aggiunge l'app ClickOnce alla cartella Startup
  2. Rimuove automaticamente la voce Avvio quando viene disinstallata l'app ClickOnce (dopo il riavvio o la disconnessione / accesso)
  3. È stato testato e funziona su Windows XP, Windows 7, Windows Server 2000/2003, Windows 8

La mia soluzione

Fondamentalmente, la tua app scriverà un file .bat nella cartella Startup che avvia l'app ClickOnce per te. Il file .bat è abbastanza intelligente da rilevare se l'app è stata disinstallata e si eliminerà se l'app ClickOnce non può essere trovata.

Passaggio 1

Far funzionare il file batch. Sostituisci PUBLISHER_NAME e APPLICATION_NAME con i valori giusti. Puoi trovarli installando l'app ClickOnce, quindi seguendone il percorso sul tuo 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)

Il file batch verificherà se l'app ClickOnce è installata (verificando se esiste il file appref-ms) e, in tal caso, avvia. Altrimenti, il file batch si elimina da solo, tramite un metodo delineato qui .

Ora che hai il file batch, provalo. Rilascialo nella cartella Startup per assicurarti che avvii la tua app al login.

Passaggio 2

Ora, nel codice della tua app, devi scrivere questo file batch nella cartella Startup. Ecco un esempio usando il file batch sopra in C # (nota che c'è un po 'di escape e che sta accadendo il voodoo della variabile d'ambiente):

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

Eccolo qui. Commenti / miglioramenti sono benvenuti.

EDIT: virgolette fisse nel passaggio 2

Sfortunatamente, tutti questi trucchi non funzionano su Vista. Vista blocca questi programmi all'avvio per qualche motivo.

Come suggerito da @thijs, puoi facilmente bypassare la "sicurezza" di Vista su questo. Vedi il post su come eseguire app clickonce all'avvio di Windows .

Bene, ci sono molti modi per avviare l'applicazione all'avvio, ma c'è un problema di pulizia. Anche se usi la chiave di registro di avvio e sembra a posto, comunque dovresti ripulire tutto ciò che hai aggiunto al sistema. Puoi dare un'occhiata al mio articolo, ho avuto lo stesso aspetto pulito per risolvere il problema e utilizzare il file di disinstallazione di automazione e cutom per risolvere il problema.

Grazie DiscDev e dbenham. La soluzione funziona alla grande. Volevo solo condividere il codice di lavoro aggiornato basato sull'ultimo di 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);
        }

Prima di tutto grazie per la risposta Discdev. Per farlo funzionare con & # 197; & # 196; & # 214; e altri caratteri speciali che questa modifica ha fatto per me, usando UTF-8 una tabella codici diversa e nessuna DBA.

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

In termini di far effettivamente avviare l'applicazione all'avvio, avere un collegamento nella cartella di avvio è la soluzione migliore. Oppure, se non la cartella di avvio, il tasto reg di avvio.

Un modo per aggirare il fatto di non avere l'icona nella sua posizione normale è fare in modo che l'applicazione inserisca un collegamento a se stessa nella cartella di avvio all'avvio dell'applicazione. Le app ClickOnce verranno eseguite la prima volta che vengono installate. L'applicazione può utilizzare questo avvio per inserire un collegamento nella cartella Avvio. Ora il link sarà in entrambi i posti e dovresti essere d'oro.

Il problema è tuttavia che ora l'eliminazione dell'app ClickOnce non la eliminerà più. ClickOnce non terrà traccia del collegamento manuale aggiunto e quindi ogni volta che qualcuno disinstalla l'app e si riavvia, verrà reinstallata. Vorrei iniziare considerando che quel programma non si comporta bene :(.

Puoi aggiungere la tua app all'appropriato " Esegui " chiave di registro di avvio all'avvio. Quindi, anche se non puoi rimuoverlo quando l'app viene eliminata, non danneggerà nulla e nessuno vedrà il riferimento rotto.

Nel caso in cui aiuti chiunque altro ancora a cercare una soluzione a questo commento in fondo http://johnnycoder.com/blog/2009/02/24/clickonce-run-at-startup/ suggerisce di impostare le opzioni di ClickOnce Publish (in VS.Net 2010 che è attivo le proprietà del progetto, la schermata di pubblicazione e le opzioni) con Nome editore impostato su Avvio e Nome suite lasciato vuoto. Questo porta il collegamento al programma nella cartella di avvio per me su Windows 7. Non so cosa fanno le altre versioni di Windows.

Per qualche ragione, Windows non avviava la mia app (il file " .appref-ms ") durante l'accesso. Quindi, ho trovato una soluzione che potrebbe essere utile anche ad altri.

Quando la mia app viene installata per la prima volta (e all'avvio della mia app), aggiungo / verifico che la posizione corrente delle mie applicazioni string.Concat (Application.ExecutablePath, " " ;, " / startup ") esiste nel registro " HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Run " . Quando l'applicazione si avvia, controllo gli argomenti per " / startup " e se è presente, esegui il seguente codice.

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.

Questo ha funzionato alla grande per me. Ma, se aggiungi semplicemente il valore Application.ExecutablePath al registro senza l'argomento " / startup & , l'applicazione si avvierà all'avvio di Windows ma non nel contesto di a " fai clic una volta " applicazione. Ciò non ti consentirà di accedere a ApplicationDeployment.CurrentDeployment . Anche se, ha funzionato alla grande, esiste ancora il problema che quando la mia applicazione viene disinstallata, l'impostazione del registro non viene rimossa. Ciò può essere risolto utilizzando la @Ivan Leonenko soluzione di disinstallazione personalizzata. Spero che questo aiuti ...

Faccio questo e lavoro per me

 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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top