【问题标题】:C# Run application MINIMIZED at windows startupC# 在 Windows 启动时运行应用程序 MINIMIZED
【发布时间】:2011-05-26 03:16:38
【问题描述】:

我得到以下代码在 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 启动时)。 我没有找到有效的代码/很好的解释如何做到这一点。 你能帮帮我吗?

谢谢。

【问题讨论】:

  • 我在 2019 年 1 月的今天发现了这个问题,Ron 提出的子程序今天仍然有效,稍作修改:startupKey=Registry.CurrentUser.OpenSubKey(runKey) 谢谢您的子程序。简短而简单。

标签: c# .net startup minimized


【解决方案1】:

你试过了吗

this.WindowState = FormWindowState.Minimized;

如果你只想在windows启动时开始最小化你可以在命令行中添加额外的参数,比如myapp.exe --start-minimized,然后你可以解析这个参数并检测你是否需要最小化开始。

【讨论】:

  • 您也可以创建一个链接文件 (*.lnk) 并选择启动最小化集,但我更喜欢这个答案。
  • 在静态 main 方法中,参数显示为传入的字符串数组。这是 MSDN 中的文档msdn.microsoft.com/en-us/library/aa288457(v=vs.71).aspx
  • 好的。我添加了 startupKey.SetValue(AppName, Application.ExecutablePath.ToString() + " /minimized");并在 program.cs 中将 string[] args 添加到 main 函数中。有效。但还有别的东西——奇怪的事情发生了。我的程序在加载时读取了一个 xml 文件。如果我手动运行程序,它可以工作,但是当我在启动时运行它时,它不会读取 xml 文件。任何想法为什么?
  • @Ron:可能问题出在工作目录中。如果您的应用程序在当前目录中查找 xml,它可能找不到它。尝试检查当前目录。
【解决方案2】:

由于这只是将注册表项添加到 SOFTWARE\Microsoft\Windows\CurrentVersion\Run 导致操作系统在启动时启动应用程序,因此您无能为力,除非您要启动的应用程序接受命令行参数开始最小化(然后您可以将参数添加到密钥的可执行路径)。

如果这是一个必要的功能,并且您不能修改程序以接受一个参数来最小化,我唯一能想到的就是编写一个程序,在操作系统启动它们后最小化这些应用程序。

【讨论】:

    【解决方案3】:

    通常不要恢复旧线程,而是一种简单的方法,包括最小化到系统托盘,对于这样的 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 通知图标,因此我需要它在 Windows 启动时进入系统托盘。

    【讨论】:

      【解决方案4】:

      很难找到一个好的答案,终于在一本很旧的书中找到了它。在我的 Forms 应用程序中,刚刚打开 program.cs 并进行了更改

      Application.Run(new Form1());
      

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

      它打开时没有闪烁直接进入托盘。这个应用程序更像是一个服务,所以将它设置为只有一个通知图标和右键单击时的退出按钮。希望这会有所帮助!

      【讨论】:

      • 问题是使用最小化窗口的 Window Startup 启动应用程序..您回答的是如何在最小化窗口的情况下运行应用程序.. 而且f.ShowInTaskbar = false; 将使您的程序启动不可识别,如果我没记错的话,你将永远看不到用户界面..
      【解决方案5】:

      我也遇到过同样的问题,找到了可行的解决方案:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-02
        • 1970-01-01
        • 2011-08-22
        • 2017-04-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多