我有一个小型应用程序,CheckBox
如果用户希望该应用程序从Windows启动,可以对其进行设置。
我的问题是如何实际设置应用程序在启动时运行。
ps:我在C#和.NET 2.0中使用。
Answers:
几个选项,按优先顺序排列:
HKey_Current_User\Software\Microsoft\Windows\CurrentVersion\Run
注册表项。唯一的问题是,它要求对注册表的写访问权,但它并不总是可用。HKey_Local_Machine\Software\Microsoft\Windows\CurrentVersion\Run
注册表项。唯一的问题是,它要求对注册表的写访问权,但它并不总是可用。这个答案现在比较老。自从我撰写本文以来,Windows 10已发布,它更改了“开始菜单”文件夹的工作方式……包括该Startup
文件夹。对我来说,尚不清楚仅在该文件夹中添加或删除文件而不引用Windows用于这些位置的内部数据库有多么容易。
感谢大家如此迅速的回应。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);
}
AppName
?
这是将程序添加到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引导上运行,以管理员身份运行,需要管理员权限)
UI
显示。但是服务器仍然可以正常运行。(Windows Server 2016)
您可以在“ HKCU \ Software \ Microsoft \ Windows \ CurrentVersion \ Run”中创建注册表项,只需注意它在Vista上可能会有所不同。由于UAC,您的设置可能会“虚拟化”。
这是一个非常简单的解决方案:
加上
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);
如果将某个应用程序设计为在Windows启动时(而不是在用户登录时)启动,则您唯一的选择是使用Windows服务。将应用程序作为服务编写,或者编写仅用于启动应用程序的简单服务。
编写服务可能很棘手,并且可能会针对您的特定情况施加一些可能无法接受的限制。一种常见的设计模式是前端/后端对,其中有负责工作的服务和与该服务进行通信以向用户显示信息的应用程序前端。
另一方面,如果只希望您的应用程序在用户登录时启动,则可以使用Joel Coehoorn列出的方法1或2。
/// <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);
}
}
我发现向启动文件夹添加快捷方式对我来说是最简单的方法。我必须添加对“ 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();
添加应用以在Windows 10启动时自动运行
步骤1:选择Windows“开始”按钮并滚动查找要在启动时运行的应用程序。
步骤2:右键点击该应用,选择更多,然后选择打开文件位置。这将打开保存应用程序快捷方式的位置。如果没有“打开文件位置”选项,则意味着该应用程序无法在启动时运行。
步骤3:在文件位置打开的情况下,按Windows徽标键+ R,键入shell:startup,然后选择OK。这将打开启动文件夹。
步骤4:将快捷方式从文件位置复制并粘贴到应用程序的“启动”文件夹中。