C # Запускает приложение, СВЕРНУТОЕ при запуске Windows

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

  •  10-10-2019
  •  | 
  •  

Вопрос

Я получил следующий код для запуска приложения при запуске 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();
        }
    }

Это работает.но я хочу, чтобы программа запускалась свернутой (только при запуске Windows).Я не нашел рабочего кода / хорошего объяснения, как это сделать.Не могли бы вы мне помочь, пожалуйста?

Спасибо.

Это было полезно?

Решение

Вы пробовали

this.WindowState = FormWindowState.Minimized;

Если вы хотите начать сворачивание только при запуске Windows, вы можете добавить дополнительный аргумент в командную строку, например myapp.exe --start-minimized, затем вы можете проанализировать этот параметр и определить, нужно ли вам начинать сворачивать или нет.

Другие советы

Поскольку это всего лишь добавление раздела реестра в SOFTWARE\Microsoft\ Windows\CurrentVersion un, который заставляет ОС запускать приложение при запуске, вы мало что можете сделать, если приложение, которое вы хотите запустить, не примет параметр командной строки для запуска в свернутом виде (затем вы могли бы добавить параметр в путь к исполняемому файлу ключа).

Если это необходимая функция, и вы не можете изменить программу, чтобы она принимала параметр для минимизации, единственное, что я могу придумать, это написать программу, которая минимизировала бы эти приложения после их запуска операционной системой.

Мне было очень трудно найти хороший ответ на этот вопрос, и в конце концов я нашел его в действительно старой книге.В моем приложении Forms просто открыл program.cs и изменил

Application.Run(new Form1());

Для

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

и он открывается без малейшего щелчка прямо в лоток.Это приложение было скорее просто сервисом, поэтому установите для него просто значок уведомления и кнопку выхода при щелчке правой кнопкой мыши.Надеюсь, это поможет!!

Обычно не восстанавливайте старые потоки, но есть один простой способ, включая сворачивание в системный трей, для WPF, подобного этому:

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

Ваш класс окон:

  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;

    }

Сработало в первый раз, поэтому пришлось выложить пост.Я использую WPF notifyicon, поэтому мне нужно было, чтобы он переходил в системный трей при запуске Windows.

Я боролся с той же проблемой и нашел рабочее решение:

В вашем program.cs, обработайте параметр, а затем передайте этот параметр в 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"));
    }
}

В вашем Form1.cs, вы можете вызвать функцию с переданным параметром и свернуть приложение:

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

Например, с помощью этой функции, которую я использовал, если вы запустите приложение с параметром -minimized, то оно начнет сворачиваться, на панели задач появится значок уведомления и пузырь, сообщающий, что приложение запущено и работает в фоновом режиме.

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

}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top