不论是WinForm程序还是WPF程序,实现开机自启动的原理都是向注册表中写值,位置在注册表的“LocalMachine\SOFTWARE\Microsoft\Windows\CurrentVersion\Run”目录下。
手动编辑注册表实现应用程序开机自启动请查看下面文章:
C#程序实现
1.判断注册表键值对是否存在
private bool IsExistKey(string keyName)
{
try
{
bool _exist = false;
RegistryKey local = Registry.LocalMachine;
RegistryKey runs = local.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", true);
if (runs == null)
{
RegistryKey key2 = local.CreateSubKey("SOFTWARE");
RegistryKey key3 = key2.CreateSubKey("Microsoft");
RegistryKey key4 = key3.CreateSubKey("Windows");
RegistryKey key5 = key4.CreateSubKey("CurrentVersion");
RegistryKey key6 = key5.CreateSubKey("Run");
runs = key6;
}
string[] runsName = runs.GetValueNames();
foreach (string strName in runsName)
{
if (strName.ToUpper() == keyName.ToUpper())
{
_exist = true;
return _exist;
}
}
return _exist;
}
catch
{
return false;
}
}
写入/删除注册表键值对
///isStart--是否开机自启动
///exeName--应用程序名
///path--应用程序路径
private static bool SelfRunning(bool isStart, string exeName, string path)
{
try
{
RegistryKey local = Registry.LocalMachine;
RegistryKey key = local.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", true);
if (key == null)
{
local.CreateSubKey("SOFTWARE//Microsoft//Windows//CurrentVersion//Run");
}
if (isStart)//若开机自启动则添加键值对
{
key.SetValue(exeName, path);
key.Close();
}
else//否则删除键值对
{
string[] keyNames = key.GetValueNames();
foreach (string keyName in keyNames)
{
if (keyName.ToUpper() == exeName.ToUpper())
{
key.DeleteValue(exeName);
key.Close();
}
}
}
}
catch (Exception)
{
return false;
//throw;
}
return true;
}
实现开机自启动
namespace KSHServer
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
private static bool IsStart = Convert.ToBoolean(ConfigurationManager.AppSettings["IsStart"]);
public MainWindow()
{
InitializeComponent();
if (!IsExistKey("ServerApp") && IsStart)
{
SelfRunning(IsStart, "ServerApp", @"E:\ServerApp\ServerApp.exe");
}
else if (IsExistKey("ServerApp") && !IsStart)
{
SelfRunning(!IsStart, "ServerApp", @"E:\ServerApp\ServerApp.exe");
}
}
控制是否开机自启动的字段放在了配置文件App.config中,根据需要修改即可(true:开机自启动;false:取消开机自启动)
<appSettings>
<!--是否开机自启动-->
<add key="IsStart" value="true"/>
</appSettings>
namespace ServerApp
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
private static bool IsStart = Convert.ToBoolean(ConfigurationManager.AppSettings["IsStart"]);
public MainWindow()
{
InitializeComponent();
if (!IsExistKey("ServerApp") && IsStart)
{
SelfRunning(IsStart, "ServerApp", @"E:\ServerApp\ServerApp.exe");
}
else if (IsExistKey("ServerApp") && !IsStart)
{
SelfRunning(!IsStart, "ServerApp", @"E:\ServerApp\ServerApp.exe");
}
}
控制是否开机自启动的字段放在了配置文件App.config中,根据需要修改即可(true:开机自启动;false:取消开机自启动)