【问题标题】:c# winforms: determine first run of programc# winforms:确定程序的第一次运行
【发布时间】:2008-10-17 02:38:53
【问题描述】:

我需要在安装后第一次运行我的 Windows 窗体应用程序时展示一次向导。我想我可以使用像 firstrun = false 这样的用户设置。但是我还需要处理程序被卸载然后重新安装的情况。该用户设置将如何重置?它已经存在于该用户的 ...\Users--user--\AppData\Roaming... 的配置文件中。我需要在重新安装后运行该向导,因此我需要重置该设置。我是否需要通过自定义安装程序操作来执行此操作?

【问题讨论】:

    标签: c# .net windows winforms


    【解决方案1】:

    最好让您的安装程序在注册表中创建 FirstRun 键并将其设置为 true(或 1 或其他),并确保您的卸载程序完全删除此键。然后让您的应用程序在启动时读取此密钥,并将其设置为 false(或 0 或其他)。

    如果用户卸载然后重新安装您的应用程序,他们将在第一次运行它时再次看到该向导。

    【讨论】:

    • 如果此注册表项是每个用户的,则只有安装该应用程序的用户才能获得 FRW。如果该密钥在 HKLM 中,则只有管理员用户才能更新它,因此任何非管理员用户都将继续获得 FRW,直到管理员运行该应用程序。
    • 是的。另外,我认为 MS 不再鼓励使用注册表。旧习惯很难改掉。
    • 这就是我最终要做的。但我正在转向另一种技术,即 FRW 检查数据库表。
    【解决方案2】:

    Windows 注册表似乎适合这种类型的设置。安装程序步骤可以在用户重新安装时重置密钥,或者如果您不想在安装之间保留任何设置,您可以在卸载时清除注册表项。

    【讨论】:

    • 注册表的问题是,如果设置进入 HKCU,那么使用安装程序为当前用户以外的用户清除它是一件痛苦且不标准的事情。因此,如果其他用户运行(卸载)安装,那么您实际上无法访问 HKCU。
    • 除非您使用 HKLM 中的键或值来维护已运行该向导的用户列表。我喜欢这个想法,但是您会遇到权限问题,因为许多用户无法写入 HKLM。这让我觉得@Franci 的回答是最好的。
    【解决方案3】:

    在多个 Windows 用户使用同一个应用的情况下,每个用户的 true/false 设置将永远无法正常工作。安装程序仅作为 Windows 用户之一运行一次,并且无法访问该计算机上所有其他用户的每用户设置。

    您可以在安装时将每台机器的标志设置为 true。但是,如果管理员用户运行 FRW 并对其进行更改,则其他用户将不会获得 FRW。如果非管理员用户运行 FRW,他们将无法更改它,并将在下次应用运行时再次运行 FRW。

    您需要的是安装的机器范围的时间戳和运行 FRW 的每个用户的时间戳。这是场景:

    安装时,在 HKLM 注册表中为您的应用添加时间戳。对于每个用户,当应用程序启动时,请检查您上面提到的每个用户设置文件中的首次运行向导 (FRW) 的时间戳。如果每用户时间戳早于 HKLM 安装时间戳,请为该用户运行 FRW 并更新每用户设置文件。

    如果应用程序被卸载然后重新安装,安装程序将更新 HKLM 时间戳,从而导致 FRW 再次为所有用户运行。

    【讨论】:

      【解决方案4】:

      在设置文件或 resx 文件中使用名称-值对,例如 FirstRun=true。启动时读取此文件,如果为 true,则显示 Wizard 并设置为 false。
      每次安装时,文件的副本都应该被覆盖,因此您将获得 FirstRun=true。该向导将在每次(重新)安装后运行

      【讨论】:

      • 这不适用于有多个 Windows 用户的方案。如果文件是每次安装的,则首次运行向导将仅为第一个用户运行。如果是针对每个用户的,则安装只会为执行安装的用户覆盖它。
      • 两个不同的东西 - 如果它是应用程序级别的设置,这个想法会起作用.. 在程序/安装文件夹等用户不可知的位置存储并查找它。如果是用户级设置,请将其存储在用户特定的位置。取决于req是什么......
      【解决方案5】:

      可以存储已运行配置向导的用户列表。

      此列表可以存储在机器级配置文件或应用程序目录中。重新安装应用程序时,此列表可能会被清除。

      您只需使用列表检查当前用户,而不是查看 FirstRun。如果用户在列表中,请跳过配置向导。如果用户不在列表中,则显示配置向导。

      【讨论】:

      • 或者这样做但是在 HKLM 中存储一个值,例如一个多字符串值。
      【解决方案6】:

      您可以在程序目录中创建一个文件。卸载程序不会删除它,因为它不是由安装程序添加的。

      【讨论】:

        【解决方案7】:

        我建议您更改程序的行为,并且不要在重新安装后重置配置设置。毕竟用户已经做出了选择,为什么还要问同样的问题呢?

        【讨论】:

        • 程序可能会在新版本中引入新的重要设置,怎么样? :-)
        • 在这种情况下,您的配置文件会丢失那些新的重要设置,并基于此在启动时显示配置向导。
        • 当然,也可以。我只是发现 FRW 是向用户介绍新功能的好地方,但之后是否使用它取决于她。
        【解决方案8】:

        类似于@Franci Penov 的建议,我会这样做:

        • 在安装时,使用新生成的 GUID 创建注册表值 HKLM\Software\YourCompany\YourApp\InstallId。

        • 在用户首次运行时,将该值与 HKCU\Software\YourCompany\YourApp\InstallId 进行比较。

        • 如果 HKCU 值不存在或它们不同,请运行您的首次运行逻辑,然后将 HKLM\Software\YourCompany\YourApp\InstallId 复制到 HKCU\Software\YourCompany\YourApp\InstallId。

        这具有不易受时间变化影响的(微小)优势。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-11-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-14
          相关资源
          最近更新 更多