C # Запускает приложение, СВЕРНУТОЕ при запуске Windows
Вопрос
Я получил следующий код для запуска приложения при запуске 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();
}
}