C#中实现程序开机自启动

时间:2022-11-30 20:32:45

需求:公司话务系统,要求加上开机自启动功能

实现:

1、首先想到写注册表,关键代码如下:

 

 1 C#中实现程序开机自启动public   void  RunWhenStart( bool  Started,  string  name,  string  path)
 2 C#中实现程序开机自启动C#中实现程序开机自启动         {
 3C#中实现程序开机自启动            RegistryKey HKLM = Registry.LocalMachine;
 4C#中实现程序开机自启动            RegistryKey Run = HKLM.CreateSubKey(@"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\");
 5C#中实现程序开机自启动            if (Started == true)
 6C#中实现程序开机自启动C#中实现程序开机自启动            {
 7C#中实现程序开机自启动                try
 8C#中实现程序开机自启动C#中实现程序开机自启动                {
 9C#中实现程序开机自启动                    Run.SetValue(name, path);
10C#中实现程序开机自启动                    HKLM.Close();
11C#中实现程序开机自启动                }

12C#中实现程序开机自启动                catch (Exception)
13C#中实现程序开机自启动C#中实现程序开机自启动                {
14C#中实现程序开机自启动                    MessageBox.Show("注册表修改错误(开机自启未实现)");
15C#中实现程序开机自启动                }

16C#中实现程序开机自启动            }

17C#中实现程序开机自启动            else
18C#中实现程序开机自启动C#中实现程序开机自启动            {
19C#中实现程序开机自启动                try
20C#中实现程序开机自启动C#中实现程序开机自启动                {
21C#中实现程序开机自启动                    if (Run.GetValue(name) != null)
22C#中实现程序开机自启动C#中实现程序开机自启动                    {
23C#中实现程序开机自启动                        Run.DeleteValue(name);
24C#中实现程序开机自启动                        HKLM.Close();
25C#中实现程序开机自启动                    }

26C#中实现程序开机自启动                    else
27C#中实现程序开机自启动                        return;
28C#中实现程序开机自启动                }

29C#中实现程序开机自启动                catch (Exception e)
30C#中实现程序开机自启动C#中实现程序开机自启动                {
31C#中实现程序开机自启动                    ExceptionTransact.WriteErrLog(base.GetType().Name, e.Message);
32C#中实现程序开机自启动                    // 
33C#中实现程序开机自启动                }

34C#中实现程序开机自启动            }

35C#中实现程序开机自启动        }

用了一段时间后,发现问题出来了:公司市场部的电脑,用户没有写注册表的权限,所以此功能无效,只能另想办法。

本来考虑写一个系统服务,由系统服务启动话务系统,不过在实现中遇到了问题:话务系统单独启动没有问题,由系统服务启动时在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          }

 

 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          }

 

现在系统服务启动应用程序的问题还在解决中.