一、实现前提
要达到开机自启动,可通过增加自启动注册表实现
其中自启动注册表分为两部分
①HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run:该路径仅适用于当前用户
②HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run:适用于所有用户
二、实现方法
string regPath = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run";
string path = Application.ExecutablePath.ToLower();
string name = Path.GetFileName(path);
var regKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(regPath, true);
if (regKey == null)
regKey = Microsoft.Win32.Registry.LocalMachine.CreateSubKey(regPath);
regKey.SetValue(name, path);
三、注意事项
3.1 不允许访问注册表权限
要写入HKEY_LOCAL_MACHINE,需要管理员权限,否则程序会报错
改成写入HKEY_CURRENT_USER后,不需要管理员权限
3.2 目录下没有相关注册表
如果程序是32位,则注册表位置会在HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node,这个路径下的注册表项是专门为32位应用程序而设计的,并存储在64位系统的32位注册表视图中
四、存在问题点
4.1 修改HKEY_LOCAL_MACHINE下注册标时权限问题
部分Win10电脑可以可以直接修改,不会提示权限不足,但是部分电脑又会提示权限不足。
经对比,所有电脑账户均为管理员账户,UAC控制均为关闭,差异点在于不提示权限不足的电脑未激活Window(目前只发现这个差异点,不清楚根本原因)
4.2 注册表重定位问题
32位程序在64系统写入HKEY_LOCAL_MACHINE时,会重定位到HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node
但是在写入HKEY_CURRENT_USER时,注册表不会进行重定位
放一个chatgpt的回答