“ shutdown.exe”破坏应用程序设置

时间:2018-10-11 13:44:03

标签: c# wpf batch-file shutdown application-settings

我有一个单窗口WPF应用程序(Win8.1 / .net4.7),未处理Window.Closing-Event,对Window.Closed-Event的处理如下:

private void Window_Closed(object sender, EventArgs e)
{
    Properties.Settings.Default.WinMainLocationX = this.Left; // ok
    Properties.Settings.Default.WinMainLocationY = this.Top; // ok
    Properties.Settings.Default.WinMain_size = new Size(this.Width, this.Height); // crucial setting
    Properties.Settings.Default.WinMain_state = this.WindowState; // ok

    Properties.Settings.Default.Save();
}

我每天一次通过包含C:\WINDOWS\system32\shutdown.exe /s /t 20且之后没有任何内容的批处理文件关闭该应用程序(此时始终处于空闲状态)。这样,计算机即可正常关​​闭。通过命令行输入shutdown.exe可以看到shutdown /?的参数。

问题:每隔7或8天,窗口大小就会以一种使应用程序(在早上启动后)看起来像这样的方式损坏:

enter image description here

如何保护我的应用程序设置不受shutdown.exe的干扰?

2 个答案:

答案 0 :(得分:1)

我认为问题在于在最小化应用程序窗口的同时存储设置。在这种情况下,窗口的宽度和高度将为0。

您可以使用窗口的RestoreBounds属性来获取其还原大小,而与当前状态无关:

Properties.Settings.Default.WinMainLocationX = this.RestoreBounds.Left; 
Properties.Settings.Default.WinMainLocationY = this.RestoreBounds.Top;
Properties.Settings.Default.WinMain_size = new Size(this.RestoreBounds.Width, this.RestoreBounds.Height);
Properties.Settings.Default.WinMain_state = this.WindowState;

此问题的某些答案显示了使用WinAPI函数GetWindowPlacement / SetWindowPlacement的另一种方法:

答案 1 :(得分:0)

添加Environment.Exit(0)已解决了该问题。我可以想象问题的原因是两次访问Window.Closed-Handler。

private void Window_Closed(object sender, EventArgs e)
{
    Properties.Settings.Default.WinMainLocationX = this.Left; // ok
    Properties.Settings.Default.WinMainLocationY = this.Top; // ok
    Properties.Settings.Default.WinMain_size = new Size(this.Width, this.Height); // crucial setting
    Properties.Settings.Default.WinMain_state = this.WindowState; // ok

    Properties.Settings.Default.Save();

    Environment.Exit(0);
}