Search code examples
c#wpfbatch-fileshutdownapplication-settings

"shutdown.exe" destroys application settings


I have a one-window WPF application (Win8.1 / .net4.7), the Window.Closing-Event is unhandled, the Window.Closed-Event is handled as follows:

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();
}

I'm closing the app (at this point always in idle state) once a day by a batch file containing C:\WINDOWS\system32\shutdown.exe /s /t 20 and nothing afterwards. By this the computer shuts down properly. The parameters of shutdown.exe can be seen by command line input of shutdown /?.

Problem: Every 7 or 8 days the window size gets corrupted in a way that the application (after having started in the morning) looks like this:

enter image description here

How can I protect my application settings from interference by shutdown.exe?


Solution

  • I think the problem is storing the settings while the application window is minimized. Width and Height of the window will be 0 in this case.

    You can use the RestoreBounds property of your window to get its restored size independent of its current state:

    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;
    

    Some answers to this question show another approach using the WinAPI functions GetWindowPlacement / SetWindowPlacement: