.net - programas - como hacer que un programa se inicie al encender la pc
¿Cómo puedo hacer que una aplicación implementada con un solo clic se ejecute al inicio? (11)
En primer lugar, gracias por la respuesta de 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 sin lista de materiales.
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);
¿Cómo puedo hacer que una aplicación implementada Click-Once ejecute un inicio?
La mejor opción que encontré al buscar fue configurar Publisher en la aplicación para el inicio, por lo que el atajo del menú de inicio se colocaría en la carpeta de inicio, pero eso parece un gran truco y me gustaría que hubiera un menú de inicio. puedo encontrar.
¿Que opciones tengo?
En términos de lograr que la aplicación se lance al inicio, tener tu enlace en la carpeta de inicio es tu mejor opción. O si no es la carpeta de inicio, entonces la clave de registro de inicio.
Una forma de evitar tener el ícono en su posición normal es hacer que la aplicación coloque un enlace en la carpeta de inicio al inicio de 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 Inicio. Ahora el enlace estará en ambos lugares y deberías estar dorado.
Sin embargo, está el problema de que ahora eliminar la aplicación ClickOnce ya no lo eliminará. ClickOnce no hará un seguimiento del enlace manual agregado y, por lo tanto, cada vez que alguien desinstale su aplicación y la reinicie, se volverá a instalar. Comenzaría considerando que el programa no se está comportando bien :(.
Puede agregar su aplicación a la clave de registro de inicio "Ejecutar" correspondiente al inicio. Entonces, aunque no pueda eliminarlo cuando se elimine su aplicación, no dañará nada y nadie verá la referencia interrumpida.
Todos estos trucos no funcionan en Vista, lamentablemente. Vista bloquea estos programas al inicio por alguna razón.
Según lo sugerido por @thijs, puede evitar fácilmente la "seguridad" de vista en este caso. Consulte blogpost sobre cómo ejecutar aplicaciones de clickonce en el inicio de Windows .
Siento que agregar su aplicación a la carpeta de inicio no es profesional. Recomiendo 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 simple configurar una tecla para iniciar una aplicación de un solo clic y no requiere el establecimiento de atajos 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);
En caso de que ayude a alguien más a buscar una solución a esto, 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 se encuentra en las propiedades del proyecto, pantalla de publicación y opciones) con el nombre del editor configurado en Inicio y el nombre de la Suite en blanco. Eso consigue el acceso directo del programa en la carpeta de inicio para mí en Windows 7. No sé lo que hacen otras versiones de Windows.
Bueno, hay varias formas de iniciar la aplicación al inicio, pero hay un problema de limpieza. Incluso si usa la clave de inicio de registro y se ve bien, de todos modos debe limpiar todo lo que agregó al sistema. Puede echar un vistazo a mi artículo, me enfrenté al mismo problema de limpieza y usé el archivo de desinstalación de automatización y corte para resolver el problema.
Gracias DiscDev y dbenham. La solución funciona genial 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);
}
Lo hago y trabajas 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
Después de leer todos los comentarios sobre este hilo y la publicación del blog johnnycoder mencionada anteriormente , se me ocurrió una solución que:
- Agrega su aplicación ClickOnce a la carpeta de Inicio
- Quita el elemento de inicio automáticamente cuando se desinstala la aplicación ClickOnce (después de reiniciar o cerrar sesión / iniciar sesión)
- Fue probado y funciona en Windows XP, Windows 7, Windows Server 2000/2003, Windows 8
Mi solución
Básicamente, su aplicación estará escribiendo un archivo .bat
en la carpeta de Inicio que inicia la aplicación ClickOnce por usted. El archivo .bat
es lo suficientemente inteligente como para detectar si la aplicación se ha desinstalado y se eliminará a sí misma 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 hacia ella 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 verificará si su aplicación ClickOnce está instalada (al ver si existe el archivo appref-ms) y la ejecutará si es así. De lo contrario, el archivo por lotes se elimina a sí mismo, a través de un 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 Inicio. Aquí hay un ejemplo que utiliza el archivo de proceso por lotes anterior en C # (tenga en cuenta que hay algo de escape, y que el vudú variable de entorno está sucediendo):
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í tienes. Comentarios / mejoras bienvenidas.
EDITAR: Cotizaciones fijas en el paso 2
Por alguna razón, Windows no iniciaría mi aplicación (el archivo ".appref-ms") al iniciar sesión. Entonces, se me ocurrió una solución que otros podrían encontrar también útil.
Cuando mi aplicación se instala por primera vez (y al inicio de mi aplicación), agrego / verifico que la ubicación actual de mis aplicaciones, string.Concat(Application.ExecutablePath, " ", "/startup")
existe en el registro "HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Run"
. Cuando la aplicación se inicia, verifico los argumentos para "/ inicio" y si eso 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 funciono muy bien para mi. Pero, si solo agrega el valor de Application.ExecutablePath
al registro sin el argumento "/startup"
, la aplicación se iniciará cuando Windows se inicie pero no en el contexto de una aplicación de "haga clic una vez". 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, no se elimina la configuración del registro. Esto se puede solucionar utilizando la solución de desinstalación personalizada de @Ivan Leonenko . Espero que esto ayude...