C#中级-开机自动启动程序

Posted airforce094

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#中级-开机自动启动程序相关的知识,希望对你有一定的参考价值。

一、前言

       关于C#开机自动启动程序的方法,网上出现比较多的是修改注册表:

       1. HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run或者RunOnce

       2.HKEY_Current_User\Software\Microsoft\Windows\CurrentVersion\Run或者RunOnce

       将你想要自动开机执行的程序的名称与路径写入该注册表就能实现开机自动启动,但是!这个方法是有问题的:

      1. 微软自Vista之后对注册表的权限管理更加严格,需要一系列的权限操作,对注册表操作需要app.manifest文件:

          <requestedExecutionLevel level="highestAvailable" uiAccess="false" />

          并且操作注册表时还需要

          Registry.LocalMachine.OpenSubKey(Yoursubkey,

          RegistryKeyPermissionCheck.ReadWriteSubTree,System.Security.AccessControl.RegistryRights.FullControl);实现全部控制

      2. 我在编写开机自动启动程序时也是先用修改注册表的方法,但是发现针对不同电脑不是每次都能成功的,也就是说修改注册表的方法的成功率并不是100%

 

二、一个古老而可靠的方法

       其实有一个相当可靠而且实用的方法,那就是在计算机【开始/启动】文件夹中,将你想要开机自动启动的程序的快捷方式放入进去。这样下次开机就会执行这个文件夹的程序,

      不要忘记 !如果不是每次开机都要执行这个程序的话,你应该在程序中有一个删除该快捷方式的语句。

     

      下面是我的开机自动程序的组成部分:

      1. 需要开机自动执行的程序                 Restart.exe

      2. 一个引导执行Restart.exe的脚本      Restart.vbs

    

      如果Restart.exe与.vbs 在客户机的任意一个硬盘上的任意一个位置,我的流程是:

      1. 生成Restart.vbs的快捷方式Restart.lnk——>将.lnk剪切至【开始/启动】文件夹内

      2. 当下次开机时会先通过快捷方式.lnk执行.vbs,再通过.vbs执行.exe

      3. 当exe里的程序执行完之后,用File.Delete将.lnk删除(我可不想每次开机执行这个.lnk)

 

三、代码实现

     1. vbs脚本代码 (这个脚本必须和.exe在同一文件夹中)

Set shell =Wscript.createobject("WScript.Shell")  
shell.Run "Restart.exe",0,False

     

     2. 创建快捷方式的代码 (需要引入COM组件,名称为Windows Script Host Object Model)

 if (!File.Exists(Environment.GetFolderPath(Environment.SpecialFolder.Startup) + "\\Restart.lnk"))
 {
     IWshRuntimeLibrary.WshShell shell = new IWshRuntimeLibrary.WshShell();
     IWshRuntimeLibrary.IWshShortcut shortcut = (IWshRuntimeLibrary.IWshShortcut)shell.CreateShortcut(System.IO.Path.Combine("Your exe file path", "Restart.lnk"));
     shortcut.TargetPath = System.IO.Path.Combine("Your exe file path", "Restart.vbs"); 
     shortcut.WorkingDirectory = "Your exe file path";
     shortcut.WindowStyle = 7;
     shortcut.Save();            
     File.Move(System.IO.Path.Combine("Your exe file path", "Restart.lnk"), Environment.GetFolderPath(Environment.SpecialFolder.Startup) + "\\Restart.lnk");
 }

      注意!最后一句!  

      File.Move的Environment.GetFolderPath(Environment.SpecialFolder.Startup) + "\\Restart.lnk"

      不能写成

      Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Startup),"Restart.lnk")

 

    3. 执行完exe中的主要代码后,删除该快捷方式以防每次开机都执行这个程序(根据自已的需要)

File.Delete(Environment.GetFolderPath(Environment.SpecialFolder.Startup) + "\\Restart.lnk");

 

 

 

 

 

 

 

 

 

 

 

 

     

 

以上是关于C#中级-开机自动启动程序的主要内容,如果未能解决你的问题,请参考以下文章

c#写的winform设置了启动检查更新,又设置了开机自动启动,开机自启动时不能启动更新程序

C# 一个程序启动另一个程序,ProcessStartInfo.Arguments接收参数

C# 程序开机自动启动,但是获取当前路径名称是不正确,请教怎么解决?

C# 将当前应用程序写入到注册表开机启动项中

如何用C#语言通过服务来实现开机启动?

linux下jar包的生存与开机自动启动