Pregunta

Obtuve el siguiente código para ejecutar la aplicación en el inicio de Windows:

    private void SetStartup(string AppName, bool enable)
    {
        string runKey = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run";

        Microsoft.Win32.RegistryKey startupKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(runKey);

        if (enable)
        {
            if (startupKey.GetValue(AppName) == null)
            {
                startupKey.Close();
                startupKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(runKey, true);
                startupKey.SetValue(AppName, Application.ExecutablePath.ToString());
                startupKey.Close();
            }
        }
        else
        {
            startupKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(runKey, true);
            startupKey.DeleteValue(AppName, false);
            startupKey.Close();
        }
    }

Funciona. Pero quiero que el programa comience minimizado (solo en el inicio de Windows). No encontré un código de trabajo / buena explicación de cómo hacerlo. ¿Puedes ayudarme por favor?

Gracias.

¿Fue útil?

Solución

Has probado

this.WindowState = FormWindowState.Minimized;

Si desea comenzar a minimizar en el inicio de Windows, solo puede agregar argumento adicional a la línea de comandos, como myapp.exe --start-minimized, luego puede analizar este parámetro y detectar si necesita comenzar minimizado o no.

Otros consejos

Dado que esto solo agrega una clave de registro al software Microsoft Windows CurrentVersion Ej. Que hace que el sistema operativo inicie la aplicación al inicio, no puede hacer mucho, a menos que la aplicación a la que desea iniciar acepta un parámetro de línea de comandos Inicie minimizado (luego puede agregar el parámetro a la ruta ejecutable de la clave).

Si esta es una función necesaria y no puede modificar el programa para aceptar un parámetro para minimizar lo único que puedo pensar sería escribir un programa que minimizaría estas aplicaciones después de que el sistema operativo las haya iniciado.

Me costó mucho encontrar una buena respuesta a esto, finalmente la encontré en un libro muy antiguo. En mi aplicación de formularios, acaba de abrir el programa.cs y cambiado

Application.Run(new Form1());

a

Form1 f = new Form1();
f.WindowState = FormWindowState.Minimized;
f.ShowInTaskbar = false;
Application.Run(f);

y se abre sin un parpadeo directamente a la bandeja. Esta aplicación era más solo un servicio, así que configúrelo para que solo tenga un botón de notificación de icono y salida cuando se haga clic derecho. ¡¡Espero que esto ayude!!

Normalmente no revive los hilos antiguos, sino una manera fácil, incluido el minimización de la bandeja del sistema, para WPF como este:

     public class EntryPoint
    {
        [STAThread]
        public static void Main(string[] args)
        {
            SingleInstanceManager manager = new SingleInstanceManager();
            manager.Run(args);
        }
    }

    public class SingleInstanceManager : WindowsFormsApplicationBase
    {
        SingleInstanceApplication app;

        public SingleInstanceManager()
        {
            this.IsSingleInstance = true;
        }

        protected override bool OnStartup(Microsoft.VisualBasic.ApplicationServices.StartupEventArgs e)
        {
            app = new SingleInstanceApplication();
            app.Run();
            return false;
        }

        protected override void OnStartupNextInstance(StartupNextInstanceEventArgs eventArgs)
        {
            base.OnStartupNextInstance(eventArgs);
            app.Activate();
        }
    }

    public class SingleInstanceApplication : Application
    {
        protected override void OnStartup(System.Windows.StartupEventArgs e)
        {
            base.OnStartup(e);

            bool startMinimized = false;
            for (int i = 0; i != e.Args.Length; ++i)
            {
                if (e.Args[i] == "/StartMinimized")
                {
                    startMinimized = true;
                }
            }

            MainWindow mainWindow = new MainWindow();
            if (startMinimized)
            {
                mainWindow.WindowState = WindowState.Minimized;
            }
            mainWindow.Show();
        }


        public void Activate()
        {
            this.MainWindow.Activate();
            this.MainWindow.WindowState = WindowState.Normal;
        }
    }
}

Tu clase de ventana:

  public partial class MainWindow : Window
{
    private Window _window;

    public MainWindow()
    {
    InitializeComponent();

        SetStartup("AppName", true);
    }
 private void SetStartup(string AppName, bool enable)
    { 
        string runKey = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Run";
        Microsoft.Win32.RegistryKey startupKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(runKey); 
        if (enable)
        { 
            if (startupKey.GetValue(AppName) == null) 
            { 
                startupKey.Close(); 
                startupKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(runKey, true);
                startupKey.SetValue(AppName, Assembly.GetExecutingAssembly().Location + " /StartMinimized");
                startupKey.Close(); 
            }
        } 
        else 
        {
            startupKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(runKey, true);
            startupKey.DeleteValue(AppName, false); 
            startupKey.Close(); 
        }
    }

 private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        if (this.WindowState == System.Windows.WindowState.Minimized)
        {
            var minimized = (_window.WindowState == WindowState.Minimized);

            _window.ShowInTaskbar = !minimized;
        }
        else
            ShowInTaskbar = true;

    }

Funcionó por primera vez, así que tuve que publicar. Estoy usando WPF Notifyicon, de ahí por qué necesitaba que fuera a la bandeja del sistema en el inicio de Windows.

He presentado con el mismo problema y encontré una solución de trabajo:

En tus program.cs, manejar el parámetro y luego pasar ese parámetro a Form1:

static void Main(string[] args)
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    if (args.Length != 0){
        Application.Run(new Form1(args[0]));
    }
    else
    {
        Application.Run(new Form1("normalState"));
    }
}

En tus Form1.cs, puede llamar a una función con el parámetro aprobado y minimizar la aplicación:

public Form1(string parameter)
{
    InitializeComponent();
    MinimizeApp(parameter);
}

Por ejemplo, con esta función que utilicé, si inicia la aplicación con el parámetro minimizado, se iniciará minimizado, aparece un notificador en la barra de tareas y una burbuja que dice que la aplicación se inicia y se ejecuta en segundo plano.

public void MinimizeApp(string parameter)
{
    if (parameter == "-minimized")
    {
        this.WindowState = FormWindowState.Minimized;
        notifyIcon1.Visible = true;
        notifyIcon1.BalloonTipText = "Program is started and running in the background...";
        notifyIcon1.ShowBalloonTip(500);
        Hide();
    }

}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top