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

Posted

技术标签:

【中文标题】如何设置程序在启动时启动【英文标题】: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)。 【参考方案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】:

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

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

【讨论】:

以上是关于如何设置程序在启动时启动的主要内容,如果未能解决你的问题,请参考以下文章

c#写的winform设置了启动检查更新,又设置了开机自动启动,开机自启动时不能启动更新程序

如何在 Windows 启动时启动应用程序?

如何在启动 OSX spritekit 应用程序时设置自定义光标?

苹果mac如何启动项?

如何设置jvm启动参数

导航抽屉:如何在启动时设置所选项目?