У меня есть небольшое приложение с опцией CheckBox
, которую пользователь может установить, если они хотят, чтобы приложение начиналось с Windows.
Мой вопрос в том, как настроить приложение для запуска при запуске.
ps: Я использую С# с .NET 2.0.
У меня есть небольшое приложение с опцией CheckBox
, которую пользователь может установить, если они хотят, чтобы приложение начиналось с Windows.
Мой вопрос в том, как настроить приложение для запуска при запуске.
ps: Я использую С# с .NET 2.0.
Несколько вариантов в порядке предпочтения:
HKey_Current_User\Software\Microsoft\Windows\CurrentVersion\Run
. Единственная проблема здесь - требуется доступ на запись в реестр, что не всегда доступно.HKey_Local_Machine\Software\Microsoft\Windows\CurrentVersion\Run
. Единственная проблема здесь - требуется доступ на запись в реестр, что не всегда доступно. Этот ответ сейчас старше. С тех пор, как я написал это, была выпущена Windows 10, которая меняет работу папок меню "Пуск", включая папку " Startup
". Мне еще не ясно, насколько легко просто добавить или удалить файл в этой папке, не ссылаясь также на внутреннюю базу данных, используемую Windows для этих расположений.
Спасибо всем за быстрый ответ. Джоэл, я использовал твой вариант 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);
}
Вам нужно установить раздел реестра, как правило, с помощью установщика. См. http://www.windowsdevcenter.com/pub/a/oreilly/windows/ron/startup_0401.html для полного пошагового руководства.
Вы можете создать запись реестра в "HKCU\Software\Microsoft\Windows\CurrentVersion\Run", просто имейте в виду, что она может работать по-разному в Vista. Ваша настройка может быть "виртуализирована" из-за UAC.
Здесь вы можете добавить свою программу для запуска 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, работает от имени администратора, требуются права администратора)
Если приложение предназначено для запуска при запуске Windows (в отличие от того, когда пользователь входит в систему), единственным вариантом является включение службы Windows. Либо напишите приложение как услугу, либо напишите простую службу, которая существует только для запуска приложения.
Письменные услуги могут быть сложными и могут вводить ограничения, которые могут быть неприемлемыми для вашего конкретного случая. Один общий шаблон проектирования - это интерфейсная/задняя пара, с сервисом, который выполняет работу и интерфейс приложения, который связывается с сервисом для отображения информации пользователю.
С другой стороны, если вы просто хотите, чтобы ваше приложение запускалось при входе в систему, вы можете использовать методы 1 или 2, перечисленные Джоэлем Кохорном.
В дополнение к ответу Xepher Dotcom, путь к папке при запуске Windows должен быть закодирован следующим образом:
var Startup = Environment.GetFolderPath(Environment.SpecialFolder.Startup);
/// <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);
}
}
Это очень простое решение:
Добавить
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);
Вы можете сделать это с помощью класса win32 в пространстве имен Microsoft.
using Microsoft.Win32;
using (RegistryKey key = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true))
{
key.SetValue("aldwin", "\"" + Application.ExecutablePath + "\"");
}
Для меня было проще всего добавить ярлык в папку автозагрузки. Мне пришлось добавить ссылку на "Объектную модель хоста скрипта 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();