49495


最小化時のフォーム座標を保存したいのですが、  
下のコードを実行すると座標がマイナス値になってしまいます。

[code]

    protected override void OnResize(EventArgs e)
    {
        base.OnResize(e);
    
        if(this.WindowState == FormWindowState.Minimized)
        {
            MessageBox.Show(this.Location.ToString());
        }
    }
    
[/code]

最小化する直前の座標を取得するためにはどうすればよいでしょうか。


CC BY-SA 4.0
2018-10-21T03:49:04.913
49492
2018-12-12T06:08:01.690
30138
question
c#
C# 2010　最小化時のフォーム座標を取得


> 次回起動時のために座標を保存する

「最小化する直前の座標」だけでなく最大化する直前の座標や、マルチモニタ環境でどのモニタに表示されていたのかなども考慮が必要です。更に次回起動時にモニタサイズが縮小されていると画面外に溢れたりなども考慮が必要です。

C#ではありませんがWindows APIの[`GetWindowPlacement`](https://docs.microsoft.com/en-
us/windows/desktop/api/winuser/nf-winuser-
getwindowplacement)を使うとこの辺り一式の値が取得でき、更に[`SetWindowPlacement`](https://docs.microsoft.com/en-
us/windows/desktop/api/winuser/nf-winuser-
setwindowplacement)を使うと一気に復元できます。C#からは`DllImport`を使用して呼び出し可能です。


CC BY-SA 4.0
2018-10-21T06:31:13.153
49495
2018-10-21T06:31:13.153
4236
49492
answer


信用度が足りないのでコメントできないため、こちらで追加情報を書きます。

ssayuriさんがリンクを張られている所から、[`tagWINDOWPLACEMENT`構造体](https://docs.microsoft.com/en-
us/windows/desktop/api/winuser/ns-winuser-
tagwindowplacement)へジャンプできます。そこには、次のように書かれています。

[code]

    typedef struct tagWINDOWPLACEMENT {
      UINT  length;
      UINT  flags;
      UINT  showCmd;
      POINT ptMinPosition;
      POINT ptMaxPosition;
      RECT  rcNormalPosition;
      RECT  rcDevice;
    } WINDOWPLACEMENT;
    
[/code]

P/INVOKEをするためにはこの構造体をC#で定義しなければなりませんが、そのとき`rcDevice`を含めると、`SetWindowPlacement`が期待したように動作しません。`FALSE`を返すわけではないのですが、ウィンドウ位置が変わらない、という現象になりました。  
上記の通りの構造体だとサイズが60バイトになりますが、`GetWindowPlacement`で取得した（取得によって情報が書き換わった）構造体は、`length`プロパティが44でした。`rcDevice`を定義から外して、サイズが44バイトの構造体を渡すと、期待通りに動作しました。もし、`SetWindowPlacement`で`TRUE`が返ってくるのにウィンドウ位置が変わらない場合は、これを疑ってみてください。  
（Windows 10 Build1709で確認）


CC BY-SA 4.0
2018-11-14T11:24:40.330
50324
2018-11-14T11:24:40.330
29996
49492
answer


this.LocationはOnResizeイベントでなくても取得できると思います。  
美しくはないですが、例えばタイマー等で取得し、マイナスでない場合は  
採用し、マイナスの場合は捨てる等の処理を行うこともできます。


CC BY-SA 4.0
2018-12-12T06:08:01.690
51138
2018-12-12T06:08:01.690
24490
49492
answer