¿Cómo puedo hacer que una aplicación implementada con un clic se ejecute al inicio?

StackOverflow https://stackoverflow.com/questions/401816

  •  03-07-2019
  •  | 
  •  

Pregunta

¿Cómo puedo hacer que una aplicación implementada con un solo clic ejecute un inicio?

La mejor opción que encontré al buscar fue configurar el Editor en la aplicación como Inicio, por lo que el acceso directo del menú Inicio se ubicaría en la carpeta Inicio, pero parece un gran truco y me gustaría que hubiera un Inicio icono de menú que la gente puede encontrar.

¿Qué opciones tengo?

¿Fue útil?

Solución

Siento que agregar tu aplicación a la carpeta de inicio no es profesional. Recomiendo encarecidamente utilizar una clave de registro de inicio para iniciar su aplicación.

Al contrario de lo que dice gran parte del material sobre este tema, es extremadamente sencillo configurar una tecla para iniciar una aplicación con un solo clic y no es necesario configurar accesos directos adicionales. Simplemente use el acceso directo creado en la instalación:

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

Otros consejos

Después de leer todos los comentarios en este hilo y la En la publicación del blog de johnnycoder mencionada anteriormente , se me ocurrió una solución que:

  1. Agrega tu aplicación ClickOnce a la carpeta de inicio
  2. Elimina el elemento de inicio automáticamente cuando se desinstala la aplicación ClickOnce (después de reiniciar o cerrar sesión / iniciar sesión)
  3. Se probó y funciona en Windows XP, Windows 7, Windows Server 2000/2003, Windows 8

Mi solución

Básicamente, su aplicación escribirá un archivo .bat en la carpeta de Inicio que inicia la aplicación ClickOnce para usted. El archivo .bat es lo suficientemente inteligente como para detectar si la aplicación se ha desinstalado y se eliminará si no se puede encontrar la aplicación ClickOnce.

Paso 1

Haz que el archivo por lotes funcione. Reemplace PUBLISHER_NAME y APPLICATION_NAME con los valores correctos. Puede encontrarlos instalando su aplicación ClickOnce, y luego siguiendo la ruta en su sistema de archivos:

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

El archivo por lotes comprobará si su aplicación ClickOnce está instalada (al ver si existe el archivo appref-ms) y lo iniciará si es así. De lo contrario, el archivo por lotes se elimina a sí mismo, a través del método descrito aquí .

Ahora que tiene el archivo por lotes, pruébelo. Colóquelo en su carpeta de Inicio para asegurarse de que inicie su aplicación al iniciar sesión.

Paso 2

Ahora, en el código de su aplicación, debe escribir este archivo por lotes en la carpeta de Inicio. Aquí hay un ejemplo que usa el archivo por lotes de arriba en C # (tenga en cuenta que se está produciendo un escape y una variable de entorno vudú):

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

Ahí lo tienes. Comentarios / mejoras bienvenidas.

EDITAR: citas fijas en el paso 2

Todos estos trucos no funcionan en Vista desafortunadamente. Vista bloquea estos programas en el inicio por alguna razón.

Tal como lo sugiere @thijs, puede omitir fácilmente la seguridad " seguridad " en este caso. Ver blogpost en cómo ejecutar las aplicaciones de clickonce en el inicio de Windows .

Bueno, hay varias formas de hacer que su aplicación se inicie en el inicio, pero hay un problema de limpieza. Incluso si usa la clave de registro de inicio y se ve bien, de todos modos debe limpiar todo lo que haya agregado al sistema. Usted puede echar un vistazo a mi artículo, me enfrenté a la misma limpieza solucione el problema y use la automatización y el archivo de desinstalación de Cutom para resolver el problema.

Gracias DiscDev y dbenham. La solución funciona muy bien. Solo quería compartir el código de trabajo actualizado basado en lo último 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);
        }

En primer lugar gracias por la respuesta Discdev. Para que esto funcione con Å Ä Ö y otros caracteres especiales, esta modificación lo hizo por mí, usando UTF-8 una página de códigos diferente y no 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);

En términos de lograr que la aplicación se inicie en el inicio, tener un enlace en la carpeta de inicio es su mejor opción. O si no es la carpeta de inicio, a continuación, la clave de registro de inicio.

Una forma de evitar el hecho de no tener el Icono en su posición normal es hacer que la aplicación coloque un enlace a sí mismo en la carpeta de inicio al iniciar la Aplicación. Las aplicaciones ClickOnce se ejecutarán la primera vez que se instalen. La aplicación puede usar este inicio para colocar un enlace en la carpeta de Inicio. Ahora el enlace estará en ambos lugares y deberías estar dorado.

Sin embargo, existe el problema de que ahora al eliminar la aplicación ClickOnce ya no se eliminará realmente. ClickOnce no rastreará el enlace del manual agregado y, por lo tanto, cada vez que alguien desinstale su aplicación y la reinicie, se volverá a instalar. Empezaría considerando que el programa no se está comportando bien :(.

Puede agregar su aplicación a la " Ejecutar " clave de registro de inicio en el inicio. Entonces, aunque no pueda eliminarlo cuando se elimine su aplicación, no dañará nada y nadie verá la referencia rota.

En caso de que ayude a alguien más que aún esté buscando una solución para esto, haga un comentario en la parte inferior http://johnnycoder.com/blog/2009/02/24/clickonce-run-at-startup/ sugiere configurar las opciones de Publicación de ClickOnce (en VS.Net 2010 que está activado Las propiedades del proyecto, la pantalla de publicación y las opciones) con el nombre del editor establecido en Inicio y el nombre de la suite se dejan en blanco. Eso hace que el acceso directo del programa a la carpeta de inicio para mí en Windows 7. No sé qué hacen otras versiones de Windows.

Por alguna razón, las ventanas no iniciarían mi aplicación (el archivo " .appref-ms ") al iniciar sesión. Por lo tanto, se me ocurrió una solución que otros podrían encontrar útil también.

Cuando mi aplicación se instala por primera vez (y al iniciarla), agrego / verifico que la ubicación actual de mis aplicaciones string.Concat (Application.ExecutablePath, " " ;, " / el inicio ") existe en el registro " HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Run " . Cuando se inicia la aplicación, reviso los argumentos para " / startup " y si está presente, ejecute el siguiente código.

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.

Esto funcionó muy bien para mí. Pero, si solo agrega el valor Application.ExecutablePath al registro sin el argumento " / startup " , la aplicación se iniciará cuando se inicie Windows, pero no en el contexto de un " haga clic una vez " solicitud. Esto no le permitirá tener acceso a ApplicationDeployment.CurrentDeployment . Aunque, esto funcionó muy bien, todavía existe el problema de que cuando se desinstala mi aplicación, la configuración del registro no se elimina. Esto se puede solucionar utilizando la solución de desinstalación personalizada @Ivan Leonenko . Espero que esto ayude ...

Hago esto y trabajo para mí

 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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top