概要
WPFプログラムでウィンドウの位置・サイズを保存する方法。
プログラム終了時にGetWindowPlacement
APIでWINDOWPLACEMENT
構造体の情報を取得・保存し、
起動時に保存してた設定を読み込み、SetWindowPlacement
APIに渡してウィンドウ状態を復元するという流れ。
スナップ表示は復元されないが、OS標準アプリ等の挙動を確認し、
- スナップ表示は一時的な表示状態
- よってスナップ状態・スナップ時のウィンドウ位置やサイズは保存しないのが正解
と判断した。
ダウンロード
サンプルソースはここでダウンロードできる。
ウィンドウの配置状態の保存のサンプル - MSDN
サンプル修正
サンプルだとGUIの設定画面から扱えない型を使っていて使いづらいので修正。
保存処理の修正箇所
// ウィンドウ表示状態取得
GetWindowPlacement(hwnd, out wp);
using (var stream = new System.IO.MemoryStream())
using (var writer = new System.Xml.XmlTextWriter(stream, Encoding.UTF8))
{
var serializer = new System.Xml.Serialization.XmlSerializer(typeof(WINDOWPLACEMENT));
serializer.Serialize(writer, wp);
byte[] buf = stream.ToArray();
string windowPlacementStr = Encoding.UTF8.GetString(buf);
// windowPlacementStrを保存する処理をここに書く
}
復元処理の修正箇所
// windowPlacementStrを読み込む処理をここに書く
WINDOWPLACEMENT wp;
using (var stream = new System.IO.MemoryStream(Encoding.UTF8.GetBytes(windowPlacementStr)))
{
var serializer = new System.Xml.Serialization.XmlSerializer(typeof(WINDOWPLACEMENT));
wp = (WINDOWPLACEMENT)serializer.Deserialize(stream);
:
:
// ウィンドウ表示状態設定
SetWindowPlacement(hwnd, ref wp);
}