检查Application.Restart()

时间:2018-06-08 07:12:52

标签: c# winforms

是否可以执行以下操作:

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

这特别针对Application.Restart而非软关闭和重新打开。

我现在唯一想到的方法就是创建一个设定值:

  • 类型:int
  • 默认值:0

在重新启动之前将其设置为1,然后检查1。

那么必须有更好的方法吗?

精选答案完美无缺!像往常一样,感谢社区为我的大脑带来了一个新功能:P

我用它来解决在另一个线程上在Application.Restart上发布Mutex的问题。由于Mutex是线程锁定的,因此在重新启动之前我无法在登录功能上释放互斥锁,导致重新启动以返回锁定的互斥锁并且无法继续。有了这个,我可以知道它是否重新启动,然后做一个简单的延迟,直到第一个“应用程序”实际关闭,过早地程序的Main()关闭导致Mutex被清除。 while()将继续,现在我的应用程序正常工作!

显然,对于我的需求,这不是最理想的结果,但确实有效,这就是我所能要求的。

4 个答案:

答案 0 :(得分:3)

您是否可以访问文件系统?如果是这样,请编写一个保存退出状态的配置文件。如果退出正常保存为(比方说)0,重新启动时保存为1,然后在启动时读取此文件。第一次启动时,此文件可能不存在(除非它是安装程序的一部分),因此如果不存在则假设为0.

如果您使用的是Windows,也可以使用注册表设置。这并不难。

答案 1 :(得分:3)

您可以使用临时环境变量:

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

答案 2 :(得分:0)

重启时,可以将(命令行相似)参数传递给main。默认为0,因此默认情况下不显示欢迎回传框。

关于如何在重新启动之前更改参数,请检查Modify command line arguments before Application.Restart()

答案 3 :(得分:0)

如果是关于重新启动应用程序,则无需存储设置。

如果不是重新启动,而是下次用户打开应用程序,那么您肯定需要存储设置。

在这个答案中,我将分享解决方案,说“欢迎回来!”重新启动应用程序后的用户。这样做。在下面的示例中,使用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());
    }
}

如果您想使用原始命令行参数并操纵它而不是消除它,那么请看一下这篇文章: