C# 写注册表自动启动不生效的坑

warning: 这篇文章距离上次修改已过316天,其中的内容可能已经有所变动。
一个程序需要实现自启动,一般通过注册表来实现。写完程序后测试没任何异常,也没报错,但是到'计算机\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;
    }

none
最后修改于:2023年06月16日 14:07

评论已关闭