如何设置程序在启动时启动
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设置了启动检查更新,又设置了开机自动启动,开机自启动时不能启动更新程序