sh1’s diary

プログラミング、読んだ本、資格試験、ゲームとか私を記録するところ

ウィンドウの配置状態の保存・復元の実装例

ウィンドウの配置状態の保存・復元

要点は、 MSDN にあるとおりです。
WINDOWPLACEMENT 構造体 が、画面上のウィンドウの配置についての情報を管理しているため、この情報を保存し再設定することでタイトルにある目的を達成することができます。

詳細

一番よくまとめられていると思った記事は、下記参考にもあげた「WPF でウィンドウ位置とサイズを保存・復元しよう - grabacr.net」が、最もよくまとまっているように思いました。
本来であれば、それを読めば終わりなのですが、サンプルプログラムの URL が切れていたので、この記事を用意した次第です。
つまり、サンプルを用意した補足の記事です。なお、コードの主要な部分は以下の2点だけです。

public void Read(Window window)
{
    if (window == null) throw new ArgumentNullException(nameof(window));

    WINDOWPLACEMENT placement;
    var hwnd = new WindowInteropHelper(window).Handle;
    GetWindowPlacement(hwnd, out placement);
}

public void Attach(Window window, WINDOWPLACEMENT placement)
{
    if (window == null) throw new ArgumentNullException(nameof(window));
    if (placement == null) throw new ArgumentNullException(nameof(placement));

    var hwnd = new WindowInteropHelper(window).Handle;
    var place = placement.Value;

    place .length = Marshal.SizeOf(typeof(WINDOWPLACEMENT));
    place .flags = 0;
    place .showCmd = (place .showCmd == SW.SHOWMINIMIZED) ? SW.SHOWNORMAL : place .showCmd;

    SetWindowPlacement(hwnd, ref place);
}

変更点

ウィンドウの配置状態の情報をどこに保存するべきか、という問題の解決方法に Settings.settings を利用しました。 Settings.settings は、デザイナー画面に用意された型を使うのが基本です。なので、 partial を使って Settings クラスをファイルを追加して拡張しています。 (今回は WINDOWPLACEMENT 型を追加しています)

サンプルのダウンロード

参考

Windows Presentation Foundation プログラミング入門

Windows Presentation Foundation プログラミング入門