C#中实现程序开机自启动
需求:公司话务系统,要求加上开机自启动功能
实现:
1、首先想到写注册表,关键代码如下:
1
public void RunWhenStart(bool Started, string name, string path)
2
{
3
RegistryKey HKLM = Registry.LocalMachine;
4
RegistryKey Run = HKLM.CreateSubKey(@"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\");
5
if (Started == true)
6
{
7
try
8
{
9
Run.SetValue(name, path);
10
HKLM.Close();
11
}
12
catch (Exception)
13
{
14
MessageBox.Show("注册表修改错误(开机自启未实现)");
15
}
16
}
17
else
18
{
19
try
20
{
21
if (Run.GetValue(name) != null)
22
{
23
Run.DeleteValue(name);
24
HKLM.Close();
25
}
26
else
27
return;
28
}
29
catch (Exception e)
30
{
31
ExceptionTransact.WriteErrLog(base.GetType().Name, e.Message);
32
//
33
}
34
}
35
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
2
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
3
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
4
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
5
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
6
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
7
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
8
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
9
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
10
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
11
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
12
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
13
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
14
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
15
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
16
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
17
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
18
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
19
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
20
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
21
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
22
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
23
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
24
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
25
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
26
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
27
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
28
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
29
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
30
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
31
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
32
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
33
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
34
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
35
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
用了一段时间后,发现问题出来了:公司市场部的电脑,用户没有写注册表的权限,所以此功能无效,只能另想办法。
本来考虑写一个系统服务,由系统服务启动话务系统,不过在实现中遇到了问题:话务系统单独启动没有问题,由系统服务启动时在Application.Run(new MainForm());处一直报空引用错误,而调试中new MainForm()并不为空。由于此问题无法解决,无奈之下改用其它办法。
2、桌面生成快捷方式,然后把快捷方式复制到用户启动文件夹:
1 public static void Main()
2 {
3 WshShell shell = new WshShell();
4 //创建可执行文件快捷方式到桌面
5 IWshShortcut shortcut = (IWshShortcut)shell.CreateShortcut(
6 Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) +
7 "\\" + "XX话务系统客户端.lnk"
8 );
9 shortcut.TargetPath = System.Reflection.Assembly.GetExecutingAssembly().Location;
10 shortcut.WorkingDirectory = System.Environment.CurrentDirectory;
11 shortcut.WindowStyle = 1;
12 shortcut.Description = "XX话务系统客户端";
13 shortcut.IconLocation = System.Environment.CurrentDirectory + "\\" + "phone9.ico";
14 shortcut.Save();
15 Application.EnableVisualStyles();
16 Application.SetCompatibleTextRenderingDefault(false);
17 // get the name of our process
18 MainForm mf = new MainForm();
19 string proc = Process.GetCurrentProcess().ProcessName;
20 // get the list of all processes by that name
21 Process[] processes = Process.GetProcessesByName(proc);
22 // if there is more than one process
23 if (processes.Length > 1)
24 {
25 MessageBox.Show("程序已经运行!");
26 return;
27 }
28 else
29 Application.Run(mf);
30 }
2 {
3 WshShell shell = new WshShell();
4 //创建可执行文件快捷方式到桌面
5 IWshShortcut shortcut = (IWshShortcut)shell.CreateShortcut(
6 Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) +
7 "\\" + "XX话务系统客户端.lnk"
8 );
9 shortcut.TargetPath = System.Reflection.Assembly.GetExecutingAssembly().Location;
10 shortcut.WorkingDirectory = System.Environment.CurrentDirectory;
11 shortcut.WindowStyle = 1;
12 shortcut.Description = "XX话务系统客户端";
13 shortcut.IconLocation = System.Environment.CurrentDirectory + "\\" + "phone9.ico";
14 shortcut.Save();
15 Application.EnableVisualStyles();
16 Application.SetCompatibleTextRenderingDefault(false);
17 // get the name of our process
18 MainForm mf = new MainForm();
19 string proc = Process.GetCurrentProcess().ProcessName;
20 // get the list of all processes by that name
21 Process[] processes = Process.GetProcessesByName(proc);
22 // if there is more than one process
23 if (processes.Length > 1)
24 {
25 MessageBox.Show("程序已经运行!");
26 return;
27 }
28 else
29 Application.Run(mf);
30 }
1 private void checkBox1_CheckedChanged(object sender, EventArgs e)
2 {
3 //获取当前系统用户启动目录
4 string StartupPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Startup);
5 //获取当前系统用户桌面目录
6 string desktopPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Desktop);
7 if (checkBox1.Checked)
8 {
9 //获取可执行文件快捷方式的全部路径
10 string exeDir = desktopPath + "\\XX话务系统客户端.lnk";
11 //把程序快捷方式复制到启动目录
12 System.IO.File.Copy(exeDir, StartupPath + "\\XX话务系统客户端.lnk", true);
13 }
14 //RunWhenStart(true, Application.ProductName, Application.StartupPath + @"\XX话务系统客户端.exe");
15 else
16 {
17 System.IO.File.Delete(StartupPath + "\\XX话务系统客户端.lnk");
18 }
19 //RunWhenStart(false, Application.ProductName, Application.StartupPath + @"\XX话务系统客户端.exe");
20 }
2 {
3 //获取当前系统用户启动目录
4 string StartupPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Startup);
5 //获取当前系统用户桌面目录
6 string desktopPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Desktop);
7 if (checkBox1.Checked)
8 {
9 //获取可执行文件快捷方式的全部路径
10 string exeDir = desktopPath + "\\XX话务系统客户端.lnk";
11 //把程序快捷方式复制到启动目录
12 System.IO.File.Copy(exeDir, StartupPath + "\\XX话务系统客户端.lnk", true);
13 }
14 //RunWhenStart(true, Application.ProductName, Application.StartupPath + @"\XX话务系统客户端.exe");
15 else
16 {
17 System.IO.File.Delete(StartupPath + "\\XX话务系统客户端.lnk");
18 }
19 //RunWhenStart(false, Application.ProductName, Application.StartupPath + @"\XX话务系统客户端.exe");
20 }
现在系统服务启动应用程序的问题还在解决中.