【问题标题】:How do I set a program to launch at startup如何设置程序在启动时启动
【发布时间】:2010-10-15 01:10:11
【问题描述】:

我有一个带有CheckBox 选项的小应用程序,如果用户希望应用程序从 Windows 启动,则可以设置该选项。

我的问题是如何将应用设置为在启动时运行。

ps:我正在使用带有 .NET 2.0 的 C#。

【问题讨论】:

  • 如果您的应用程序在启动时执行一些耗时或资源密集型的操作,例如检查 Internet 上的更新,您可能需要考虑实现一个计时器,以便您的程序在启动后运行一段时间。我最讨厌的一个问题是我电脑上的十几个程序,它们都会在启动时检查更新(是的,我特别关注你,iTunes 和 Java)。

标签: c# windows


【解决方案1】:

感谢大家这么快的回复。 Joel,我使用了您的选项 2,并在当前用户的“运行”文件夹中添加了一个注册表项。 这是我为其他感兴趣的人使用的代码。

    using Microsoft.Win32;
    private void SetStartup()
    {
        RegistryKey rk = Registry.CurrentUser.OpenSubKey
            ("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);

        if (chkStartUp.Checked)
            rk.SetValue(AppName, Application.ExecutablePath);
        else
            rk.DeleteValue(AppName,false);            

    }

【讨论】:

  • 什么是 chkStartUp 变量?
  • 我知道我迟到了,@fernado Santiago,但他的复选框允许用户在启动时添加或删除程序。
  • 这对我没有帮助,它给了我权限错误。有什么办法可以手动获取权限然后释放它们?
  • AppName 是什么?
  • @mrid AppName 只是一个占位符。本质上它是字符串格式。只需将 AppName 替换为“您的应用程序的名称”即可。
【解决方案2】:

几个选项,按优先顺序排列:

  1. 将其添加到当前用户的启动文件夹。这需要您的应用程序运行的最少权限,并为用户提供对正在发生的事情的最大控制和反馈。不利的一面是,下次他们在您的程序中查看该屏幕时,确定是否显示已选中的复选框有点困难。
  2. 将其添加到HKey_Current_User\Software\Microsoft\Windows\CurrentVersion\Run 注册表项。这里唯一的问题是它需要对注册表的写访问权限,而这并不总是可用的。
  3. 创建在用户登录时触发的计划任务
  4. 将其添加到HKey_Local_Machine\Software\Microsoft\Windows\CurrentVersion\Run 注册表项。这里唯一的问题是它需要对注册表的写访问权限,而这并不总是可用的。
  5. 将其设置为 Windows 服务。仅当您真的认真,并且您确定要为计算机上的所有用户运行此程序时才这样做。李>

这个答案现在更老了。自从我写了这篇文章后,Windows 10 就发布了,它改变了“开始”菜单文件夹的工作方式……包括Startup 文件夹。我还不清楚在该文件夹中添加或删除文件而不引用 Windows 用于这些位置的内部数据库是多么容易。

【讨论】:

  • 当前用户和所有用户都有目录和注册表项。决定您的应用程序需要什么。
  • 感谢大家这么快的回复。乔尔,我和你一起去选项 2。
  • Windows 服务是的,但您需要使用 Impersonate As User 选项运行应用程序。如果不是,它只会在系统会话中启动程序一次。
  • 对于第 2 项,我们正在查看什么样的权限?我在 Win 7 上尝试了最大 UAC,但它没有任何警告。
  • @Joel 在哪些情况下您没有对 HKCU 的写入权限?我认为即使是访客用户也可以编写此注册表配置单元
【解决方案3】:

这是将程序添加到 Windows Vista、7、8、10 启动的所有方法

  • 文件路径

C:\Users\Bureau Briffault\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup(从任务管理器可见,在当前运行 用户登录成功,无需管理员权限)

C:\Users\Default\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup(从任务管理器可见,在所有用户上运行 登录成功,需要管理员权限)


  • 注册表路径

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run (从任务管理器可见,在当前用户登录成功时运行,否 需要管理员权限)

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce (在任务管理器中不可见,在当前用户登录成功时运行, 运行一次登录,无需管理员权限)

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run (从任务管理器可见,在所有用户登录成功时运行,管理员 所需权限)

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce (在任务管理器中不可见,在所有用户登录成功时运行, 运行一次登录时间,需要管理员权限)


  • 任务调度程序

Microsoft.Win32.Taskscheduler.dll(在任务管理器中不可见, 在 Windows 启动时运行,以管理员身份运行,需要管理员权限)

【讨论】:

  • 我正在使用它来启动 weblogic 服务器,并且 taks 调度程序似乎是最好的方法,因为我们不想登录到 Windows 来启动服务器。但是要注意的是,在以管理员身份运行时,这些进程在任务管理器中是可见的,并且也没有显示UI。但服务器仍然运行良好。 (Windows 服务器 2016)
  • @OP 你忘记了一个选项——创建一个在启动时启动程序的 Windows 服务:stackoverflow.com/a/15719678/2441655
【解决方案4】:

这是一个非常简单的解决方案:

添加

Microsoft.Win32.RegistryKey key = Microsoft.Win32.Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);
key.SetValue("Your Application Name", Application.ExecutablePath);

删除

Microsoft.Win32.RegistryKey key = Microsoft.Win32.Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);
key.DeleteValue("Your Application Name", false);

【讨论】:

    【解决方案5】:

    除了 Xepher Dotcom 的回答,Windows 启动的文件夹路径应该这样编码:

    var Startup = Environment.GetFolderPath(Environment.SpecialFolder.Startup);
    

    【讨论】:

      【解决方案6】:

      您可以在“HKCU\Software\Microsoft\Windows\CurrentVersion\Run”中创建一个注册表项,请注意它在 Vista 上的工作方式可能有所不同。由于 UAC,您的设置可能会“虚拟化”。

      【讨论】:

        【解决方案7】:
            /// <summary>
            /// Add application to Startup of windows
            /// </summary>
            /// <param name="appName"></param>
            /// <param name="path"></param>
            public static void AddStartup(string appName, string path)
            {
                using (RegistryKey key = Registry.CurrentUser.OpenSubKey
                    ("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true))
                {
                    key.SetValue(appName, "\"" + path + "\"");
                }
            }
        
            /// <summary>
            /// Remove application from Startup of windows
            /// </summary>
            /// <param name="appName"></param>
            public static void RemoveStartup(string appName)
            {
                using (RegistryKey key = Registry.CurrentUser.OpenSubKey
                    ("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true))
                {
                    key.DeleteValue(appName, false);
                }
            }
        

        【讨论】:

          【解决方案8】:

          如果应用程序设计为在 Windows 启动时启动(而不是在用户登录时),您唯一的选择是使用 Windows 服务。要么将应用程序编写为服务,要么编写一个仅用于启动应用程序的简单服务。

          编写服务可能很棘手,并且可能会施加对您的特定情况可能不可接受的限制。一种常见的设计模式是前端/后端对,其中一个服务负责工作,一个应用程序前端与该服务通信以向用户显示信息。

          另一方面,如果您只想让应用程序在用户登录时启动,您可以使用 Joel Coehoorn 列出的方法 1 或 2。

          【讨论】:

          • 您可以使用 NSSM 实用程序将任意应用程序作为服务运行。
          【解决方案9】:

          我发现在启动文件夹中添加快捷方式对我来说是最简单的方法。我必须添加对“Windows Script Host Object Model”和“Microsoft.CSharp”的引用,然后使用以下代码:

          IWshRuntimeLibrary.WshShell shell = new IWshRuntimeLibrary.WshShell();
          string shortcutAddress = Environment.GetFolderPath(Environment.SpecialFolder.Startup) + @"\MyAppName.lnk";
          System.Reflection.Assembly curAssembly = System.Reflection.Assembly.GetExecutingAssembly();
          
          IWshRuntimeLibrary.IWshShortcut shortcut = (IWshRuntimeLibrary.IWshShortcut)shell.CreateShortcut(shortcutAddress);
          shortcut.Description = "My App Name";
          shortcut.WorkingDirectory = AppDomain.CurrentDomain.BaseDirectory;
          shortcut.TargetPath = curAssembly.Location;
          shortcut.IconLocation = AppDomain.CurrentDomain.BaseDirectory + @"MyIconName.ico";
          shortcut.Save();
          

          【讨论】:

            【解决方案10】:

            您可以使用 Microsoft 命名空间中的 win32 类来完成此操作

            using Microsoft.Win32;
            
            using (RegistryKey key = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true))
             {
                        key.SetValue("aldwin", "\"" + Application.ExecutablePath + "\"");
             }
            

            【讨论】:

              【解决方案11】:

              如果您使用 wpf,则“ExecutablePath”不起作用。所以我也编写了一个适用于 wpf 的代码。

              using (RegistryKey key = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true))
              {
                  key.SetValue(
                      "AutoStart.exe", 
                      "\"" + System.Reflection.Assembly.GetExecutingAssembly().Location + "\""
                  );
              }
              

              【讨论】:

                【解决方案12】:

                添加一个在 Windows 10 中启动时自动运行的应用

                第 1 步:选择 Windows 开始按钮并滚动找到您要在启动时运行的应用程序。

                第 2 步:右键单击应用,选择更多,然后选择打开文件位置。这将打开保存应用程序快捷方式的位置。如果没有打开文件位置选项,则表示应用无法在启动时运行。

                第 3 步:打开文件位置,按 Windows 徽标键 + R,键入 shell:startup,然后选择 确定。这将打开 Startup 文件夹。

                第 4 步:将应用程序的快捷方式从文件位置复制并粘贴或创建到 Startup 文件夹。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2020-02-10
                  • 2014-11-12
                  • 2012-05-12
                  • 1970-01-01
                  • 2017-03-19
                  相关资源
                  最近更新 更多