Проверьте приложение.Restart () - PullRequest
0 голосов
/ 08 июня 2018

Можно ли сделать что-то вроде следующего:

bool wasRestarted = ???;
main() {
    if(wasRestarted) {
        MessageBox.Show("Welcome Back John");
    }
    Application.Restart();
}

Это специально для Application.Restart, а НЕ для плавного закрытия и повторного открытия.

Только так, как я могу думать правильноТеперь, создав значение параметра:

  • Тип: int
  • По умолчанию: 0

Установите значение 1 перед перезапуском, затем проверьте значение 1.

Должен ли быть лучший способ, чем этот?

Выбранный ответ работал отлично!Как обычно, спасибо сообществу за привнесение в мой мозг новой функции: P

Я использовал это, чтобы сделать обходной путь для выпуска Mutex в Application.Restart в другом потоке.Так как Mutex являются Thread Locked, я не смог освободить мьютекс в функции входа в систему перед перезапуском, в результате чего Restart вернул заблокированный мьютекс и не смог продолжить.При этом я мог бы знать, перезапускается ли он, а затем сделать простое время с задержкой, пока первое «Приложение» фактически не закроется и преждевременно не закроется Main () Программы, что приведет к очистке Mutex.Тогда while () продолжится, и теперь мое приложение работает как обычно!

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

Ответы [ 4 ]

0 голосов
/ 08 июня 2018

Если речь идет о перезапуске приложения, вам не нужно сохранять настройки.

Если речь идет не о перезапуске, а о том, когда пользователь откроет приложение в следующий раз, тогда вам определенно нужно сохранить параметр.

Здесь, в этом ответе, я поделюсь решением, чтобы сказать"Добро пожаловать!"пользователю после перезапуска приложения.Для этого.Здесь, в следующем примере, используя исходный код Application.Restart Я реализовал метод Restart для класса Program и передал аргумент командной строки, который показывает, что приложение было перезапущено:

Для использования достаточно вызвать Program.Restart().

static class Program
{
    private static string restartArg =  "-restart";
    public static void Restart()
    {
        var startInfo = System.Diagnostics.Process.GetCurrentProcess().StartInfo;
        startInfo.FileName = Application.ExecutablePath;
        var exit = typeof(Application).GetMethod("ExitInternal",
                            System.Reflection.BindingFlags.NonPublic |
                            System.Reflection.BindingFlags.Static);
        exit.Invoke(null, null);
        startInfo.Arguments = restartArg;
        System.Diagnostics.Process.Start(startInfo);
    }

    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        var restarted = Environment.CommandLine.Contains(restartArg);
        if (restarted)
            MessageBox.Show("Welcome back!");
        Application.Run(new Form1());
    }
}

Если вам нравится использовать исходные аргументы командной строки и манипулировать ими, а не удалять их, взгляните на этот пост:

0 голосов
/ 08 июня 2018

У вас есть доступ к файловой системе?Если это так, напишите файл конфигурации, который сохраняет ваше состояние выхода.При выходе обычно сохраните как (скажем) 0, при перезапуске сохраните как 1, а затем прочитайте этот файл при запуске.При первом запуске этот файл может отсутствовать (если он не является частью вашего установщика), поэтому примите 0, если его нет.

Если вы работаете в Windows, вы также можете использовать параметр реестра.Это не сложно.

0 голосов
/ 08 июня 2018

Для этого вы можете использовать временную переменную среды:

// Set environment variable before calling Restart
Environment.SetEnvironmentVariable("MYAPP_RESTART", "1");
Application.Restart();

// Detect restart:
var wasRestarted = Environment.GetEnvironmentVariable("MYAPP_RESTART");

if (wasRestarted == "1")
{
    // Your app was restarted
    Environment.SetEnvironmentVariable("MYAPP_RESTART", "0");
}
0 голосов
/ 08 июня 2018

Вы можете передать (аналог командной строки) аргумент в main, когда вы перезапустите его.По умолчанию его значение равно 0, поэтому по умолчанию вы не отображаете окно приветствия.

Что касается того, как изменить аргументы перед перезапуском, проверьте Изменить аргументы командной строки перед Application.Restart ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...