以下是对提供的 C# 代码的详细说明和逐行注释。代码包含两个私有方法用于启用或禁用当前应用程序的 Windows 开机自启动功能。它们操作注册表项 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run因此需要管理员权限才能正常运行。SetThisAppAutoStartup() — 设置开机自启动privatevoidSetThisAppAutoStartup(){try{// 获取当前应用程序所在目录的完整路径并拼接可执行文件名 HikVision-SDK.exestringstrPathAndAppNameApplication.StartupPath\\HikVision-SDK.exe;// 检查该文件是否存在若不存在则直接返回避免无效注册表写入if(!File.Exists(strPathAndAppName))return;// 从完整路径中提取文件名例如 HikVision-SDK.exestringstrAppNamestrPathAndAppName.Substring(strPathAndAppName.LastIndexOf(\\)1);// 移除扩展名 .exe不区分大小写仅保留基本名称作为注册表项的名称strAppNamestrAppName.Replace(.exe,);strAppNamestrAppName.Replace(.EXE,);// 打开注册表路径HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run// 参数 true 表示需要写入权限RegistryKeyRKeyRegistry.LocalMachine.OpenSubKey(SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run,true);// 如果该子键不存在理论上通常存在则创建它if(RKeynull)RKeyRegistry.LocalMachine.CreateSubKey(SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run);// 在该子键下创建或更新一个值名称为应用程序名称不含扩展名值为完整的可执行文件路径// 这样系统在启动时会自动运行该程序RKey.SetValue(strAppName,strPathAndAppName);// 关闭注册表键释放资源RKey.Close();}catch{}// 空捕获忽略任何异常如权限不足、路径错误等}以下是优化后的代码privatevoidSetThisAppAutoStartup(){try{stringexePathApplication.ExecutablePath;if(!File.Exists(exePath))return;stringnamePath.GetFileNameWithoutExtension(exePath);using(varkeyRegistry.LocalMachine.OpenSubKey(SOFTWARE\Microsoft\Windows\CurrentVersion\Run,true)){key?.SetValue(name,exePath);}}catch(Exceptionex){/* 记录日志 */}}DelThisAppAutoStartup() — 删除开机自启动privatevoidDelThisAppAutoStartup(){try{// 获取当前正在运行的可执行文件的完整路径与 Set 方法中的路径可能不同但通常一致stringstrPathAndAppNameApplication.ExecutablePath;// 检查文件是否存在一般总是存在若不存在则返回if(!File.Exists(strPathAndAppName))return;// 从完整路径中提取文件名如 HikVision-SDK.exestringstrAppNamestrPathAndAppName.Substring(strPathAndAppName.LastIndexOf(\\)1);// 去掉扩展名获得用于注册表项的名称strAppNamestrAppName.Replace(.exe,);strAppNamestrAppName.Replace(.EXE,);// 打开注册表路径写入权限RegistryKeyRKeyRegistry.LocalMachine.OpenSubKey(SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run,true);// 如果子键不存在创建它但通常不会if(RKeynull)RKeyRegistry.LocalMachine.CreateSubKey(SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run);// 注意下面两行代码存在冗余和潜在错误// RKey.SetValue(strAppName, false); // 这行会设置一个名为 strAppName 的项值为 false类型为字符串但这不会删除自启动反而会写入错误数据// RKey.DeleteSubKey(strAppName, false); // 错误DeleteSubKey 用于删除子键而不是删除值。这里 strAppName 是值名称应使用 DeleteValue。// 正确的做法应该是RKey.DeleteValue(strAppName, false); 其中 false 表示不抛出异常如果值不存在// 上述代码意图是删除该值但实现有误。修正后的写法应为// try { RKey.DeleteValue(strAppName, false); } catch { }// 由于原代码有误以下注释说明实际执行情况// - SetValue 会写入一个错误的值非字符串类型为 String值为 False// - DeleteSubKey 会尝试删除名为 strAppName 的子键但该名称通常不是子键而是值因此会失败但被 catch 忽略// 结果该自启动项不会被正确删除。// 尽管如此代码依然关闭了注册表键RKey.Close();}catch{}// 忽略所有异常}以下是优化后的方法privatevoidDelThisAppAutoStartup(){try{stringexePathApplication.ExecutablePath;if(!File.Exists(exePath))return;stringnamePath.GetFileNameWithoutExtension(exePath);using(varkeyRegistry.LocalMachine.OpenSubKey(SOFTWARE\Microsoft\Windows\CurrentVersion\Run,true)){key?.DeleteValue(name,false);// false 表示值不存在时不抛出异常}}catch(Exceptionex){/* 记录日志 */}}
C#中如何设置软件开机自启动
发布时间:2026/7/14 23:21:02
以下是对提供的 C# 代码的详细说明和逐行注释。代码包含两个私有方法用于启用或禁用当前应用程序的 Windows 开机自启动功能。它们操作注册表项 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run因此需要管理员权限才能正常运行。SetThisAppAutoStartup() — 设置开机自启动privatevoidSetThisAppAutoStartup(){try{// 获取当前应用程序所在目录的完整路径并拼接可执行文件名 HikVision-SDK.exestringstrPathAndAppNameApplication.StartupPath\\HikVision-SDK.exe;// 检查该文件是否存在若不存在则直接返回避免无效注册表写入if(!File.Exists(strPathAndAppName))return;// 从完整路径中提取文件名例如 HikVision-SDK.exestringstrAppNamestrPathAndAppName.Substring(strPathAndAppName.LastIndexOf(\\)1);// 移除扩展名 .exe不区分大小写仅保留基本名称作为注册表项的名称strAppNamestrAppName.Replace(.exe,);strAppNamestrAppName.Replace(.EXE,);// 打开注册表路径HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run// 参数 true 表示需要写入权限RegistryKeyRKeyRegistry.LocalMachine.OpenSubKey(SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run,true);// 如果该子键不存在理论上通常存在则创建它if(RKeynull)RKeyRegistry.LocalMachine.CreateSubKey(SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run);// 在该子键下创建或更新一个值名称为应用程序名称不含扩展名值为完整的可执行文件路径// 这样系统在启动时会自动运行该程序RKey.SetValue(strAppName,strPathAndAppName);// 关闭注册表键释放资源RKey.Close();}catch{}// 空捕获忽略任何异常如权限不足、路径错误等}以下是优化后的代码privatevoidSetThisAppAutoStartup(){try{stringexePathApplication.ExecutablePath;if(!File.Exists(exePath))return;stringnamePath.GetFileNameWithoutExtension(exePath);using(varkeyRegistry.LocalMachine.OpenSubKey(SOFTWARE\Microsoft\Windows\CurrentVersion\Run,true)){key?.SetValue(name,exePath);}}catch(Exceptionex){/* 记录日志 */}}DelThisAppAutoStartup() — 删除开机自启动privatevoidDelThisAppAutoStartup(){try{// 获取当前正在运行的可执行文件的完整路径与 Set 方法中的路径可能不同但通常一致stringstrPathAndAppNameApplication.ExecutablePath;// 检查文件是否存在一般总是存在若不存在则返回if(!File.Exists(strPathAndAppName))return;// 从完整路径中提取文件名如 HikVision-SDK.exestringstrAppNamestrPathAndAppName.Substring(strPathAndAppName.LastIndexOf(\\)1);// 去掉扩展名获得用于注册表项的名称strAppNamestrAppName.Replace(.exe,);strAppNamestrAppName.Replace(.EXE,);// 打开注册表路径写入权限RegistryKeyRKeyRegistry.LocalMachine.OpenSubKey(SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run,true);// 如果子键不存在创建它但通常不会if(RKeynull)RKeyRegistry.LocalMachine.CreateSubKey(SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run);// 注意下面两行代码存在冗余和潜在错误// RKey.SetValue(strAppName, false); // 这行会设置一个名为 strAppName 的项值为 false类型为字符串但这不会删除自启动反而会写入错误数据// RKey.DeleteSubKey(strAppName, false); // 错误DeleteSubKey 用于删除子键而不是删除值。这里 strAppName 是值名称应使用 DeleteValue。// 正确的做法应该是RKey.DeleteValue(strAppName, false); 其中 false 表示不抛出异常如果值不存在// 上述代码意图是删除该值但实现有误。修正后的写法应为// try { RKey.DeleteValue(strAppName, false); } catch { }// 由于原代码有误以下注释说明实际执行情况// - SetValue 会写入一个错误的值非字符串类型为 String值为 False// - DeleteSubKey 会尝试删除名为 strAppName 的子键但该名称通常不是子键而是值因此会失败但被 catch 忽略// 结果该自启动项不会被正确删除。// 尽管如此代码依然关闭了注册表键RKey.Close();}catch{}// 忽略所有异常}以下是优化后的方法privatevoidDelThisAppAutoStartup(){try{stringexePathApplication.ExecutablePath;if(!File.Exists(exePath))return;stringnamePath.GetFileNameWithoutExtension(exePath);using(varkeyRegistry.LocalMachine.OpenSubKey(SOFTWARE\Microsoft\Windows\CurrentVersion\Run,true)){key?.DeleteValue(name,false);// false 表示值不存在时不抛出异常}}catch(Exceptionex){/* 记录日志 */}}