Pergunta

Como posso fazer um aplicativo de clique-ONCE implantado executa uma inicialização?

A melhor opção que encontrei pesquisando foi definir o editor no aplicativo para inicializar, para que o atalho de menu inicial seja colocado na pasta de inicialização, mas isso parece um hack enorme e eu gostaria que haja um ícone de menu inicial pode achar.

Que opções eu tenho?

Foi útil?

Solução

Sinto que adicionar seu aplicativo à pasta de inicialização não é profissional. Eu recomendo fortemente o uso de uma chave de registro de inicialização para iniciar seu aplicativo.

Ao contrário do que muito do material deste tópico diz, é extremamente simples configurar uma chave para iniciar um aplicativo de clique uma vez e não requer a configuração de atalhos adicionais. Você simplesmente usa o atalho criado na instalação:

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

Outras dicas

Depois de ler todos os comentários sobre este tópico e o Johnnycoder blog post mencionado acima, Eu tive uma solução que:

  1. Adiciona seu aplicativo ClickOnce à pasta de inicialização
  2. Remove o item de inicialização automaticamente quando o aplicativo ClickOnce é desinstalado (após uma reinicialização ou logout/login)
  3. Foi testado e funciona no Windows XP, Windows 7, Windows Server 2000/2003, Windows 8

Minha solução

Basicamente, seu aplicativo estará escrevendo um .bat Arquivo para a pasta de inicialização que inicia o aplicativo ClickOnce para você. o .bat O arquivo é inteligente o suficiente para detectar se o aplicativo foi desinstalado e se excluirá se o aplicativo ClickOnce não puder ser encontrado.

Passo 1

Faça o arquivo em lote funcionando. Substitua Publisher_name e Application_name pelos valores corretos. Você pode encontrá -los instalando seu aplicativo ClickOnce e seguindo o caminho para ele no seu sistema de arquivos:

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

O arquivo em lote verificará se o seu aplicativo ClickOnce está instalado (vendo se o arquivo Appref-MS existe) e iniciá-lo se sim. Caso contrário, o arquivo em lote se exclui, através de um método descrito aqui.

Agora que você tem o arquivo em lote, teste -o. Solte -o na pasta de inicialização para garantir que ele inicie seu aplicativo no login.

Passo 2

Agora, no código do seu aplicativo, você precisa escrever este arquivo em lote na pasta de inicialização. Aqui está um exemplo usando o arquivo em lote acima em C# (observe que há alguma escape e a variável ambiental Voodoo acontecendo):

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

Aí está. Comentários / melhorias bem -vindas.

Editar: Citações fixas na etapa 2

Infelizmente, todos esses truques não funcionam no Vista. O Vista bloqueia esses programas na inicialização por algum motivo.

Conforme sugerido pelo @Thijs, você pode ignorar facilmente a "segurança" do Vista neste. Veja o BlogPost Como executar aplicativos ClickOnce no Windows Startup.

Bem, existem várias maneiras de fazer o seu aplicativo iniciar no início, mas há um problema de limpeza. Mesmo se você usar a chave de registro inicial e ficar bem, de qualquer maneira, você deve limpar tudo o que adicionou ao sistema. Você pode dar uma olhada no meu artigo, enfrentei o mesmo problema de limpeza e usei a automação e o arquivo de desinstalação do Cutom para resolver o problema.

Obrigado Discdev e Dbenham. A solução funciona muito bem. Só queria compartilhar o código de trabalho atualizado com base no mais recente 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);
        }

Primeiro, obrigado pela resposta discdev. Para fazer com que isso funcione com Å ä ä e outros caracteres especiais, essa modificação fez isso por mim, usando o UTF-8 uma página de código diferente e nenhum BOM.

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

Em termos de realizar o aplicativo para iniciar na inicialização, ter um link na pasta de inicialização é a sua melhor aposta. Ou se não a pasta de inicialização, a tecla Reg Startup.

Uma maneira de trabalhar em torno de não ter o ícone em sua posição normal é fazer com que o aplicativo coloque um link para si mesmo na pasta de inicialização na inicialização do aplicativo. Os aplicativos ClickOnce serão executados na primeira vez em que forem instalados. O aplicativo pode usar essa inicialização para colocar um link na pasta de inicialização. Agora, o link estará em ambos os lugares e você deve ser dourado.

No entanto, existe o problema de que a exclusão do aplicativo ClickOnce não o excluirá mais. O ClickOnce não rastreará o link manual adicionado e, portanto, toda vez que alguém não instala seu aplicativo e reinicia, ele será reinstalado. Eu começaria a considerar esse programa para não se comportar bem :(.

Você pode adicionar seu aplicativo à chave de registro de inicialização "Run" "Run" na inicialização. Então, mesmo que você não possa removê -lo quando o aplicativo for excluído, ele não prejudicará nada e ninguém verá a referência quebrada.

Caso isso ajude qualquer outra pessoa que ainda está procurando uma solução para isso um comentário no fundo http://johnnycoder.com/blog/2009/02/24/clickonce-run-at-startup/ sugere definir as opções de publicação do clickOnce (no vs.net 2010 que estão nas propriedades do projeto, na tela e opções de publicação) com o nome do editor definido para inicializar e o nome da suíte deixado em branco. Isso coloca o atalho do programa na pasta de inicialização para mim no Windows 7. Não sei o que outras versões do Windows fazem.

Por alguma razão, o Windows não inicia meu aplicativo (o arquivo ".appref-ms") ao fazer login. Então, eu encontrei uma solução que outros também podem achar úteis.

Quando meu aplicativo é instalado pela primeira vez (e na inicialização do meu aplicativo), adiciono/verifico se o local atual dos meus aplicativos string.Concat(Application.ExecutablePath, " ", "/startup") existe no registro "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run". Quando o aplicativo começa, verifico o Args para "/startup" e, se estiver presente, execute o código a seguir.

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.

Isso funcionou muito bem para mim. Mas, se você apenas adicionar o Application.ExecutablePath valor para o registro sem o "/startup" Argumentação, o aplicativo será iniciado quando o Windows iniciar, mas não no contexto de um aplicativo "clique uma vez". Isso não permitirá que você tenha acesso a ApplicationDeployment.CurrentDeployment. Embora isso tenha funcionado muito bem, o problema ainda existe que, quando meu aplicativo é desinstalado, a configuração do registro não é removida. Isso pode ser corrigido usando @Ivan Leonenko Solução de desinstalação personalizada. Espero que isto ajude...

Eu faço isso e trabalho para mim

 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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top