«shutdown.exe» уничтожает настройки приложения - PullRequest
0 голосов
/ 11 октября 2018

У меня есть однооконное приложение 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 голосов
/ 12 октября 2018

Добавление 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);
}
0 голосов
/ 11 октября 2018

Я думаю, что проблема заключается в сохранении настроек, когда окно приложения свернуто.Ширина и высота окна в этом случае будут равны 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:

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