※WinFormsの場合です。WPFではプロパティ名やイベントハンドラが異なると思います。
プロジェクトのプロパティで、下記のように設定します。
デフォルト値はフォームのプロパティから拾ってください。
フォームのコードを以下のようにします。
private void MainWindow_Load(object sender, EventArgs e)
{
// ウィンドウの位置・サイズを復元
Bounds = Properties.Settings.Default.Bounds;
WindowState = Properties.Settings.Default.WindowState;
}
private void MainWindow_FormClosing(object sender, FormClosingEventArgs e)
{
// ウィンドウの位置・サイズを保存
if (WindowState == FormWindowState.Normal)
Properties.Settings.Default.Bounds = Bounds;
else
Properties.Settings.Default.Bounds = RestoreBounds;
Properties.Settings.Default.WindowState = WindowState;
Properties.Settings.Default.Save();
}
マルチディスプレイの場合も動作確認しています。
Boundsを先に復元するのがミソだと思います。
Windows 7では画面左半分・右半分に最大化することができますが、
これは単にウィンドウサイズの変更で実装されているようで、特別扱いは必要なさそうです。
※ これが正しく保存されないアプリをときどき見かけるので、何かある気もしますが…
なお、最小化状態も保存されます。
これがユーザーの混乱を招くようなら、WindowState == FormWindowState.Minimized の場合は保存しないといいと思います。
他のサイトではPropertyBindingを使用する方法がありましたが、
やたらと挙動不審になるので私はあきらめました。