是否可以执行以下操作:
bool wasRestarted = ???;
main() {
if(wasRestarted) {
MessageBox.Show("Welcome Back John");
}
Application.Restart();
}
这特别针对Application.Restart而非软关闭和重新打开。
我现在唯一想到的方法就是创建一个设定值:
在重新启动之前将其设置为1,然后检查1。
那么必须有更好的方法吗?
精选答案完美无缺!像往常一样,感谢社区为我的大脑带来了一个新功能:P
我用它来解决在另一个线程上在Application.Restart上发布Mutex的问题。由于Mutex是线程锁定的,因此在重新启动之前我无法在登录功能上释放互斥锁,导致重新启动以返回锁定的互斥锁并且无法继续。有了这个,我可以知道它是否重新启动,然后做一个简单的延迟,直到第一个“应用程序”实际关闭,过早地程序的Main()关闭导致Mutex被清除。 while()将继续,现在我的应用程序正常工作!
显然,对于我的需求,这不是最理想的结果,但确实有效,这就是我所能要求的。
答案 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());
}
}
如果您想使用原始命令行参数并操纵它而不是消除它,那么请看一下这篇文章: