C# 写注册表自动启动不生效的坑
warning:
这篇文章距离上次修改已过526天,其中的内容可能已经有所变动。
一个程序需要实现自启动,一般通过注册表来实现。写完程序后测试没任何异常,也没报错,但是到'计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run'里查找发现没生效,里面没设置的键。
开始以为是权限的问题,然后以管理员身份运行,测试发现没效果。然后将machine改为user,即只在当前用户的环境Registry.CurrentUser里加上自启动,实测也没效果。这就有点奇怪了,这段程序代码都用了N年了,没理由突然就不行了?于是找来一台全新的电脑,把程序丢上去,运行后,再重启系统,发现可以正常自启!
但是,查了注册表,还是没这个键值,于是通过注册表搜索,终于发现了问题所在。64位注册表的路径是在WOW6432Node里的,即 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Run。
*其实这个问题跟C#无关,java,python都一样会遇到!
///
/// 设置开机启动
/// </summary>
/// <param name="appPath"></param>
/// <param name="errMsg"></param>
/// <returns>bool </returns>
public static bool setAutoStart(string appPath, out string errMsg) {
string registryKeyPath = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run";
errMsg = "";
//存在就不再去设置,兼容旧版路径。
using (RegistryKey key = Registry.LocalMachine.OpenSubKey(registryKeyPath)) {
if (key != null && key.GetValue("AppName") != null) {
if ($"{appPath} -p".Equals(key.GetValue("AppName").ToString()))
return true;
}
}
var _md5 = "AppName_" + md5(appPath);
try {
using (RegistryKey key = Registry.LocalMachine.CreateSubKey(registryKeyPath)) {
key.SetValue(_md5, $"{appPath} -p");
}
} catch (Exception ex) {
errMsg = ex.Message;
return false;
}
return true;
}
评论已关闭