如何设置要在启动时启动的程序


75

我有一个小型应用程序,CheckBox如果用户希望该应用程序从Windows启动,可以对其进行设置。

我的问题是如何实际设置应用程序在启动时运行。

ps:我在C#和.NET 2.0中使用。


1
如果您的应用程序在启动时做了一些耗时的工作或占用大量资源,例如在Internet上检查更新,则可能要考虑实现一个计时器,以便您的程序在启动后可以运行一会儿。我的烦恼之一是计算机上的十几个程序,这些程序将所有内容拖到了爬网中,因为它们都在启动时检查更新(是的,我特别关注的是iTunes和Java)。
丹娜·罗宾逊

Answers:


107

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

  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用于这些位置的内部数据库有多么容易。


有当前用户和所有用户的目录和注册表项。确定您的应用程序需要什么。
Michael Piendl 09年

感谢大家如此迅速的回应。乔尔我与你选择2.去
蜘蛛侠

Windows Service是,但是您需要使用“以用户身份模拟”选项运行该应用程序。如果不是,它将仅在系统会话中启动一次程序。
Patrik

对于数字2,我们正在查看哪种权限?我在Win 7上尝试使用最大UAC,但没有任何警告。
丹W

@Joel在什么情况下您没有对HKCU的写权限?我认为即使来宾用户也可以编写此注册表配置单元
Ricardo Polo Jaramillo

128

感谢大家如此迅速的回应。Joel,我使用了选项2,并向当前用户的“ Run”文件夹中添加了一个注册表项。这是我用于其他感兴趣的人的代码。

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

    }

3
chkStartUp变量是什么?
圣地亚哥·费尔南多(Fernando Santiago)

5
我知道我来晚了,@ fernado Santiago,但这是他的复选框,允许用户从启动中添加或删除程序。
史蒂夫·伯恩

1
这对我没有帮助,它给了我权限错误。有什么方法可以手动获取权限然后释放它们?
Jamshaid K.

2
是什么AppName
MRID

1
@mrid AppName只是一个占位符。本质上,它是字符串格式。只需将AppName替换为“您的应用程序的名称”。
标记

11

这是将程序添加到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来启动服务器。但是需要注意的是,这些进程在以admin身份运行时在任务管理器中可见,并且也未UI显示。但是服务器仍然可以正常运行。(Windows Server 2016)
Niklas

@OP您忘记了一个选项-创建一个Windows服务以在启动时启动程序:stackoverflow.com/a/15719678/2441655
Venryx

5

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


5

除了Xepher Dotcom的答案外,Windows Startup的文件夹路径也应采用以下方式编码:

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

5

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

加上

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

3

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

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

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


您可以使用NSSM实用程序将任意应用程序作为服务运行。
Mike Rosoft

1
    /// <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);
        }
    }

1

我发现向启动文件夹添加快捷方式对我来说是最简单的方法。我必须添加对“ Windows脚本宿主对象模型”和“ 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();

0

您可以使用Microsoft名称空间中的win32类来执行此操作

using Microsoft.Win32;

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

0

添加应用以在Windows 10启动时自动运行

步骤1:选择Windows“开始”按钮并滚动查找要在启动时运行的应用程序。

步骤2:右键点击该应用,选择更多,然后选择打开文件位置。这将打开保存应用程序快捷方式的位置。如果没有“打开文件位置”选项,则意味着该应用程序无法在启动时运行。

步骤3:在文件位置打开的情况下,按Windows徽标键+ R,键入shell:startup,然后选择OK。这将打开启动文件夹。

步骤4:将快捷方式从文件位置复制并粘贴到应用程序的“启动”文件夹中。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.