【问题标题】:How can I check if a program is running for the first time?如何检查程序是否第一次运行?
【发布时间】:2019-05-14 18:53:03
【问题描述】:

我的程序根据程序是否第一次运行来设置它的显示。为了确定程序是否是第一次运行,我目前正在使用一个

//this boolean exists within my programs settings
Setting boolean FirstRun = True;

当程序运行时,它会调用一个方法来检查该布尔值的状态并采取相应的行动:

if(Properties.Settings.FirstRun == true)
{ lblGreetings.Text = "Welcome New User";
  //Change the value since the program has run once now
  Properties.Settings.FirstRun = false;
  Properties.Settings.Save(); }
else
{ lblGreetings.Text = "Welcome Back User"; }

它似乎工作得非常有效,但是如果 .exe 文件被移动并从一个新位置启动它认为它是第一次运行,我担心我正在以一种混乱的方式这样做,也许存在一种更有效的方式来测试程序的首次运行。有没有更好的方法来做到这一点?

【问题讨论】:

  • 如果您详细了解您需要了解的原因,您可能会得到更好的答案。例如,如果您需要在第一次运行时向用户询问一些问题并且您存储了这些答案,那么问题将减少到将这些答案存储在哪里。另外,“第一次”是模棱两可的——这个用户第一次?第一次上这台机器?你提供的细节越多,你得到的答案就越好。
  • 您为什么希望用户移动您的应用程序?
  • @svick:这可能不是期望,而是经验。
  • 程序没有安装,它从它的 .exe 文件在本地运行。因此,如果他们下载程序并运行它,然后他们决定希望程序驻留在它认为是第一次运行的其他地方。这不是一个大问题,但我希望代码尽可能干净,所以我想也许有比我现在的方式更有效的方法。 @Tigran:你是对的,尽管如前所述,如果他们移动程序并不是什么大问题。

标签: c# .net


【解决方案1】:

似乎您的问题实际上是,如果您将 executable 移动到 同一 电脑上的另一个位置/文件夹,它会以某种方式丢失有关它已经运行至少一次这一事实的信息。

Properties.Settings.Default.FirstRun 上使用UserSettings 应该可以解决您的问题。

类似这样的东西,一个伪代码

if(Properties.Settings.Default.FirstRun == true)
{ lblGreetings.Text = "Welcome New User";
  //Change the value since the program has run once now
  Properties.Settings.Default.FirstRun = false;
  Properties.Settings.Default.Save(); }
else
{ lblGreetings.Text = "Welcome Back User"; }

查看this 示例如何更详细地实现这一目标。

【讨论】:

  • 我的代码实际上是这样的。我很抱歉我忘了用那种方式输入它。很高兴您推荐我使用它的方式。
【解决方案2】:

由于您的问题似乎与启动应用程序的每个用户有关,因此您应该设计一个针对每个用户的解决方案。

只要所讨论的设置是特定于用户的,使用 Properties.Settings 将真正有效且有效。

但是,如果这不是您的应用程序所希望的或不适合的,您也可以将用户特定的条目写入注册表。

例如:

        const string REGISTRY_KEY = @"HKEY_CURRENT_USER\MyApplication";
        const string REGISTY_VALUE = "FirstRun";
        if (Convert.ToInt32(Microsoft.Win32.Registry.GetValue(REGISTRY_KEY, REGISTY_VALUE, 0)) == 0)
        {
            lblGreetings.Text = "Welcome New User";
            //Change the value since the program has run once now
            Microsoft.Win32.Registry.SetValue(REGISTRY_KEY, REGISTY_VALUE, 1, Microsoft.Win32.RegistryValueKind.DWord);
        }
        else
        {
            lblGreetings.Text = "Welcome Back User";
        }

【讨论】:

  • 卸载应用程序时,注册表项是否会重置为 NULL 或类似内容?
  • @NeoWin:不,您需要添加一个 ..Net 安装程序类来执行这项工作或在您选择的安装程序中实现它。
【解决方案3】:

如果您不发布或描述它,很难猜出什么是乱七八糟的。一个明显的方法是有一个名为“ExePath”的设置。如果您得到 null 或与 Assembly.GetEntryAssembly().Location 不匹配的字符串,那么它要么刚刚安装,要么已移动。

【讨论】:

    猜你喜欢
    • 2016-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-17
    • 2018-01-27
    • 2011-11-05
    • 1970-01-01
    相关资源
    最近更新 更多