LoginSignup
4
5

More than 5 years have passed since last update.

WPFメモ ウィンドウ位置・サイズ保存

Last updated at Posted at 2017-03-12

概要

WPFプログラムでウィンドウの位置・サイズを保存する方法。

プログラム終了時にGetWindowPlacement APIでWINDOWPLACEMENT構造体の情報を取得・保存し、
起動時に保存してた設定を読み込み、SetWindowPlacement APIに渡してウィンドウ状態を復元するという流れ。
スナップ表示は復元されないが、OS標準アプリ等の挙動を確認し、

  • スナップ表示は一時的な表示状態
  • よってスナップ状態・スナップ時のウィンドウ位置やサイズは保存しないのが正解

と判断した。

ダウンロード

サンプルソースはここでダウンロードできる。
ウィンドウの配置状態の保存のサンプル - MSDN

サンプル修正

サンプルだとGUIの設定画面から扱えない型を使っていて使いづらいので修正。

XML形式の文字列で保存するように修正
wpf_winsize01.png

保存処理の修正箇所
// ウィンドウ表示状態取得
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);
}
4
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
5