Как я могу проверить, запущена ли программа в первый раз?

Моя программа устанавливает свой экран на основе того, запущена ли программа в первый раз или нет. Чтобы определить, запущена ли программа в первый раз, я в настоящее время использую

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

Когда программа запускается, он вызывает метод, который проверяет состояние этого значения bool и действует соответственно:

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 перемещается и запускается с нового места, он считает его первым, и я обеспокоен тем, что делаю это в беспорядочном режиме и, возможно, существует более эффективный способ тестирования программ в первую очередь. Есть ли лучший способ сделать это?

Ответ 1

Кажется, ваша проблема в том, что если вы переместите executable в другое место/папку на том же ПК, она как-то теряет информацию о том, что она уже запускалась хотя бы один раз.

Используя UserSettings, на Properties.Settings.Default.FirstRun следует решить вашу проблему.

Что-то вроде этого, псевдокод:

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"; }

Посмотрите этот пример того, как это сделать более детально.

Ответ 2

Поскольку ваш вопрос, похоже, беспокоит каждого пользователя, запускающего приложение, тогда вы должны разработать решение для каждого пользователя.

Использование свойств. Установки действительно будут работать и быть эффективными, если данный параметр зависит от пользователя.

Однако, если это нежелательно или не подходит для вашего приложения, вы также можете записать запись в пользовательскую запись в реестр.

Например:

        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";
        }

Ответ 3

Трудно догадаться, что грязно, если вы не публикуете и не описываете его. Очевидным подходом является установка с именем "ExePath". Если вы получаете нуль или строку, которая не соответствует Assembly.GetEntryAssembly(). Затем она была либо установлена, либо перемещена.

Ответ 4

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"; }

Will this work with a not executable file i.e a .sln file..??