如何清理'Run on Startup'Windows安装项目中的注册表项

本文关键字:项目 注册表 安装 Startup 何清理 Run on Windows | 更新日期: 2023-09-27 18:17:36

我编写了一个WPF应用程序,附带了一个Windows安装项目。该应用程序有一个"启动时运行"的选项,此时一个键被添加到SOFTWARE'Microsoft'Windows'CurrentVersion'Run注册表中。默认情况下,安装项目不会创建此密钥,因为默认情况下该选项是禁用的;但是,我想确保如果有人卸载应用程序,注册表项将被删除。

这可能吗?此外,如果没有删除密钥,会发生什么行为?我假设Windows会尝试运行应用程序,但什么也不会发生,但我还没有测试这种情况。

编辑-根据要求,注册表项从代码中设置如下:

using (var key = Registry.CurrentUser.OpenSubKey("SOFTWARE''Microsoft''Windows''CurrentVersion''Run", true))
{
  if (key != null)
  {
    key.SetValue("MyApp", "'"" + System.Reflection.Assembly.GetExecutingAssembly().Location + "'"");
  }
}

这样做是因为默认情况下,我不希望应用程序在启动时运行;因此,在用户选择使用该设置之前,不应该创建注册表项。

如何清理'Run on Startup'Windows安装项目中的注册表项

如果您使用安装自定义操作创建了该关键数据,那么您将需要创建卸载自定义操作来删除它。严格地说,您还应该包含一个回滚自定义操作,以便在安装失败和回滚时删除它。

MSI文件是系统更改的数据库-这就是为什么那里的任何东西都可以卸载,但它不会跟踪您对代码所做的更改。

我想把这个选项放在应用程序配置的某个地方,而不是安装,所以应用程序可以有一个选项"在登录时启动",用户可以打开和关闭。目前,任何想要更改该设置的人都必须修改注册表或重新安装应用程序,这取决于他们对这些东西有多聪明。

使用其他安装工具,您可以获得更多选择。例如,Visual Studio不支持多种功能。使用另一个工具(如WiX),您可以创建一个功能,用户检查是否需要启动,该功能包含使用Windows Installer注册表项而不是代码创建注册表项的组件。除了没有编码之外,该条目在卸载时被删除;用户可以随时进入维护模式并卸载(或添加)该功能;安装失败将自动清除。这只是提供功能的一种方式。

Visual Studio设置相对容易使用,因为它们只暴露了一组有限的Windows Installer特性,所以你得到了一些简单,但如果你想要超越VS设置提供的功能,你需要为此付出代价。但是你也会更深入地使用Windows Installer。