Windows开机自启动的API原理是向注册表

Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run

对应应用程序的运行路径,或者说启动命令,允许带参数。

HKEY_CURRENT_USER与HKEY_LOCAL_MACHINE

注册表HKEY_CURRENT_USER节点下的内容仅针对当前登录的用户生效,Windows是多账户系统(不是多用户系统,多用户允许同时多个用户登录使用当前计算机系统),不同账户下有不同的配置。

注册表HKEY_LOCAL_MACHINE节点下的内容都是针对系统所有用户生效的。

C#可以直接调用Windows API接口读写注册表

第一、实现写注册表的函数

private static bool WriteRegistryValue(RegistryKey regKey, String keyName, String value)
{if (null == keyName || 0 == keyName.Trim().Length){Console.WriteLine("WriteRegistryValue, invalid keyName: " + keyName);return false;}if (null == value || 0 == value.Trim().Length){Console.WriteLine("WriteRegistryValue, invalid value: " + value);return false;}try{bool needChange = false;String[] names = regKey.GetValueNames();if (null != names){for (int i = 0; i < names.Length; i++){String oldValue = (String)regKey.GetValue(keyName, "");if (null == oldValue || !oldValue.Equals(value)){needChange = true;break;}}}if (needChange){regKey.SetValue(keyName, value);}return true;}catch (SecurityException e){Console.WriteLine("WriteRegistryValue, SecurityException ");}catch (ObjectDisposedException e){Console.WriteLine("WriteRegistryValue, ObjectDisposedException");}catch (System.IO.IOException e){Console.WriteLine("WriteRegistryValue, IOException");}catch (UnauthorizedAccessException e){Console.WriteLine("WriteRegistryValue, IOException");}return false;
}

第二、实现向注册表节点Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run写入数值的函数

public static String getAutoStartKeyName(String softwareName, String softwarePath)
{if (null == softwareName || 0 == softwareName.Trim().Length){return "";}if (null == softwarePath || 0 == softwarePath.Trim().Length){return "";}String md5sum = Md5sum(softwarePath);return softwareName + "_" + md5sum.Substring(0, 8);
}public static bool setAutoStart(String softwareName, String softwarePath)
{if (null == softwareName || 0 == softwareName.Trim().Length){Console.WriteLine("invalid softwareName: " + softwareName);return false;}if (null == softwarePath || 0 == softwarePath.Trim().Length){Console.WriteLine("invalid softwarePath: " + softwarePath);return false;}RegistryKey localMachineKey = RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Registry64);RegistryKey regKeyRun = localMachineKey.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Run", true);RegistryKey regKeySoftware = null, regKeyMiscrosoft = null, regKeyWindows = null, regKeyCurrentVersion = null;try{if (null == regKeyRun){Console.WriteLine("openSubKey failed. try create it.");regKeySoftware = localMachineKey.CreateSubKey("Software");regKeyMiscrosoft = regKeySoftware.CreateSubKey("Microsoft");regKeyWindows = regKeyMiscrosoft.CreateSubKey("Windows");regKeyCurrentVersion = regKeyWindows.CreateSubKey("CurrentVersion");regKeyRun = regKeyCurrentVersion.CreateSubKey("Run");}String keyName = getAutoStartKeyName(softwareName, softwarePath);return WriteRegistryValue(regKeyRun, keyName, softwarePath);}finally{SafeCloseRegKey(regKeyRun); regKeyRun = null;SafeCloseRegKey(regKeyCurrentVersion); regKeyCurrentVersion = null;SafeCloseRegKey(regKeyWindows); regKeyWindows = null;SafeCloseRegKey(regKeyMiscrosoft); regKeyMiscrosoft = null;SafeCloseRegKey(regKeySoftware); regKeySoftware = null;}
}private static void SafeCloseRegKey(RegistryKey regKey)
{if (null != regKey){regKey.Close();}
}public static String Md5sum(String input)
{// step 1, calculate MD5 hash from inputSystem.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create();byte[] inputBytes = System.Text.Encoding.ASCII.GetBytes(input);byte[] hash = md5.ComputeHash(inputBytes);// step 2, convert byte array to hex stringStringBuilder sb = new StringBuilder();for (int i = 0; i < hash.Length; i++){sb.Append(hash[i].ToString("X2"));}return sb.ToString();
}

大家注意到String getAutoStartKeyName(String softwareName, String softwarePath)函数,这里是为了防止注册表中的name存在相同的情况造成冲突,因此将程序路劲也放进去MD5计算生成唯一的name保证不会冲突。

第三、实现关闭自启动

其实就是将自启动信息从注册表中删除

public static bool RemoveAutoStart(String softwarePath)
{if (null == softwarePath || 0 == softwarePath.Trim().Length){return false;}RegistryKey localMachineKey = RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Registry64);RegistryKey regKeyRun = localMachineKey.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Run", true);if (null == regKeyRun){return false;}try{String[] names = regKeyRun.GetValueNames();if (null == names || 0 == names.Length){return false;}String value;foreach (String name in names){value = (String)regKeyRun.GetValue(name, "");if (softwarePath.Equals(value)){regKeyRun.DeleteValue(name);return true;}}}catch (SecurityException e){Console.WriteLine("SecurityException");}catch (ObjectDisposedException e){Console.WriteLine("ObjectDisposedException");}catch (System.IO.IOException e){Console.WriteLine("IOException");}catch (UnauthorizedAccessException e){Console.WriteLine("IOException");}finally{SafeCloseRegKey(regKeyRun); regKeyRun = null;}return false; // TODO
}

第四、实现判断当前路径是否有自启动的方法

因为在本人工具中只设置当前用户的自启动,所以判断时只判断当前用户,如果需要所有用户请使用HKEY_LOCAL_MACHINE对应的参数

public static bool IsAutoStart(String softwarePath)
{if (null == softwarePath || 0 == softwarePath.Trim().Length){return false;}RegistryKey localMachineKey = RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Registry64);RegistryKey regKeyRun = localMachineKey.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Run", true);if (null == regKeyRun){return false;}try{String[] names = regKeyRun.GetValueNames();if (null == names || 0 == names.Length){return false;}String value;foreach (String name in names){value = (String)regKeyRun.GetValue(name, "");if (softwarePath.Equals(value)){return true;}}}catch (SecurityException e){Console.WriteLine("SecurityException");}catch (ObjectDisposedException e){Console.WriteLine("ObjectDisposedException");}catch (System.IO.IOException e){Console.WriteLine("IOException");}catch (UnauthorizedAccessException e){Console.WriteLine("IOException");}finally{SafeCloseRegKey(regKeyRun); regKeyRun = null;}return false;
}

因为小工具是自己使用的,所以没有考虑到全局用户,全局用户需要administrator权限,大家用VS编译时增加对应权限就可以了。

C#实现Windows开机自启动相关推荐

  1. html 启动bat脚本,Windows开机自启动bat脚本设置方法

    摘要 腾兴网为您分享:Windows开机自启动bat脚本设置方法,小睡眠,小书亭,托迈酷客,土豆等软件知识,以及显卡加亮,团购宝,多和梦,pdf编辑器,杭州地铁线路图,宝宝拼图游戏,蠕虫病毒专杀工具, ...

  2. Windows开机自启动jar包

    在Windows环境设置开机自启动jar包的核心思想就是把启动命令注册成一个服务,然后就可以设置开机自启动了.手写一个注册服务代码比较麻烦,可以借助线程的exe可执行文件来做. 首先去https:// ...

  3. windows开机自启动jar包的三种方式

    方式一.利用组策略,后台静默运行 1.编写运行运行jar包脚本的脚本,如 @echo off start /d "D:\visitor-services\" startup.bat ...

  4. windows 开机自启动设置 注册表修改

    开始菜单-运行命令-输入regedit回车打开注册表编辑器. 依次展开:HKEY_LOCAL_MACHINE->SOFTWARE->Microsoft->Windows->Cu ...

  5. PyQt5随笔:PyQt5 程序在开机自启动时读取文件出错导致崩溃解决办法

    PyQt5随笔:PyQt5 程序在开机自启动时读取文件出错导致崩溃解决办法 1.前言 最近在写一个 Python+pyqt5 小项目,在改善过程中想添加一个日志记录,我是打算用txt 文件记录就好,操 ...

  6. Windows设置软件开机自启动与关闭

    Windows设置软件开机自启动 有时候我们需要手动为某些软件设置开机自启动权限,或者手动取消软件开机自启动权限. 取消开机自启动权限: 1. Win+R,在打开的运行程序中输入 msconfig,回 ...

  7. Windows下怎样使用bat设置Redis和Nginx开机自启动

    场景 若依前后端分离版本,Windows下使用Nginx代理的方式进行部署(全流程,图文教程): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/d ...

  8. 【Windows工具】QuickLook-3.6.11 安装并设置开机自启动(含较难下载的 QuickLook-3.6.11 安装包百度云盘资源)

    1.QuickLook资源链接: https://pan.baidu.com/s/1netQwuSIaYGFatpjLAIYxw 提取码:fcle 2.设置开机自启动 设置开机自启动的方法很多,这里分 ...

  9. java开机自启动 Linux,java项目jar包开机自启(WINDOWS,Linux)

    WINDOWS: 1.新建一个text文件,将 java -jar D:\eclipse-workspace\attendance\target\mybatis-generator.jar写入,修改文 ...

  10. EasyRMS录播管理服务器项目实战:windows上开机自启动NodeJS服务

    本文转自EasyDarwin开源团队成员Penggy的博客:http://www.jianshu.com/p/ef840505ae06 近期在EasyDarwin开源团队开发一款基于EasyDarwi ...

最新文章

  1. 关机时 ,提示其他用户登录到这台计算机,关闭WINDOWS会使他们丢失数据
  2. Spark DataFrame 添加自增id
  3. SQL Server 查看identity值的几种方法。
  4. Android自定义View实现滴滴验证码输入框效果
  5. 2021努力拼搏,致敬为梦想而拼搏的人
  6. 面经——嵌入式软件工程师面试遇到的经典题目
  7. linux系统下RocketMQ的集群搭建
  8. android 开发对gif解码(适配android 4.2、4.3、4.4版本)
  9. 感谢所有常来我博客的朋友
  10. tif怎么转化为jpg_tif怎么批量转换成jpg
  11. 东京中文离线地图App上线
  12. 计算机网络回顾之计算机网络概述
  13. linux 软链接 相对路径,Linux入门之ln命令创建软链接的绝对路径和相对路径详解(Ubuntu)...
  14. 你永远穷不过一个广东人
  15. 2020年平时使用的资源网站
  16. Kaldi-Timit 训练
  17. 《余光中诗歌精读》放下代码,静下心来,细细品读
  18. 用tensorflow.js实现浏览器内的手写数字识别
  19. Leetcode 碎碎念
  20. Xcode 4.5 支持 amv6

热门文章

  1. 能力提升综合题单Part 8.1 图的存储与遍历
  2. 刷题记录 CF每日一题打卡 2020.6月7-6月13
  3. qt 展开指定目录_Qt5实战003:Qt Creator工程目录浅析
  4. svg动画导致持续占用CPU
  5. nginx简单的rewrite配置
  6. IM开发通信协议基础知识(一)---TCP、UDP、HTTP、SOCKET
  7. 基于raphael 的图形变化
  8. SpringCloud之Ribbon源码分析(一)
  9. RabbitMQ的工作模式及消息顺序性的保证
  10. Java中String、StringBuffer和StringBuilder的区别和堆栈内存分配