[Serializable]
public class FormPlacementSettings
{
public int X { get; set; }
public int Y { get; set; }
public int Width { get; set; }
public int Height { get; set; }
public FormWindowState WindowState { get; set; }
public string MonitorDeviceName { get; set; }
}
using System;
using System.Linq;
using System.Text.Json;
using System.Windows.Forms;
public static class FormPlacementHelper
{
public static FormPlacementSettings GetPlacement(Form form)
{
if (form.WindowState == FormWindowState.Minimized)
return null;
var bounds = form.WindowState == FormWindowState.Normal
? form.Bounds
: form.RestoreBounds;
var screen = Screen.FromRectangle(bounds);
return new FormPlacementSettings
{
X = bounds.X,
Y = bounds.Y,
Width = bounds.Width,
Height = bounds.Height,
WindowState = form.WindowState,
MonitorDeviceName = screen.DeviceName
};
}
public static void RestorePlacement(Form form, FormPlacementSettings settings)
{
if (settings == null)
return;
var screen = Screen.AllScreens
.FirstOrDefault(s => s.DeviceName == settings.MonitorDeviceName)
?? Screen.PrimaryScreen;
var workingArea = screen.WorkingArea;
int x = Math.Max(workingArea.Left,
Math.Min(settings.X, workingArea.Right - settings.Width));
int y = Math.Max(workingArea.Top,
Math.Min(settings.Y, workingArea.Bottom - settings.Height));
form.StartPosition = FormStartPosition.Manual;
form.Bounds = new System.Drawing.Rectangle(
x, y, settings.Width, settings.Height);
form.WindowState = settings.WindowState;
}
}
protected override void OnFormClosing(FormClosingEventArgs e)
{
base.OnFormClosing(e);
var placement = FormPlacementHelper.GetPlacement(this);
if (placement != null)
{
Properties.Settings.Default.FormPlacement =
JsonSerializer.Serialize(placement);
Properties.Settings.Default.Save();
}
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
var json = Properties.Settings.Default.FormPlacement;
if (!string.IsNullOrWhiteSpace(json))
{
var placement =
JsonSerializer.Deserialize<FormPlacementSettings>(json);
FormPlacementHelper.RestorePlacement(this, placement);
}
}
New Settings.settings - FormPlacement (STRING)