2 台のモニターがあり、フォームの位置を保存する必要があり、フォームが閉じられた場所に画面に表示されるはずです。
誰かが画面を取得し、フォームの読み込み時にフォームが閉じられた画面に表示する方法を提案できますか?
レジストリに保存する設定。
同様の機能を何度も実装しました。必要なのは、フォームが閉じられたときにプロパティとプロパティを保存しForm.WindowState
、フォームが開かれたときにそれらを復元することだけです。Form.Size
Form.Loaction
最も簡単な方法は、GetWindowPlacement
関数を呼び出すことです。これは、ウィンドウの画面上の座標に関する情報を含むWINDOWPLACEMENT
構造体を返します。
プロパティの代わりにこの関数を使用するForm.Location
と、複数のモニター、最小化されたウィンドウ、奇妙な位置にあるタスク バーなどで発生する問題が解決されます。
攻撃のルートはGetWindowPlacement
、アプリケーションのシャットダウン時に関数を呼び出し、ウィンドウの場所をレジストリ (またはそれを保存する場所 - レジストリはアプリケーションの状態を保存する場所として推奨されなくなりました) に永続化することです。アプリケーションが再度開かれたときに、対応するSetWindowPlacement
関数を呼び出して、ウィンドウを以前の位置に復元します。
これらは Win32 API によって公開されるネイティブ関数であり、C# で作業しているため、P/Invoke を介して呼び出す必要があります。必要な定義は次のとおりです (整理するために、これらを という名前の静的クラスに配置することをお勧めしますNativeMethods
)。
[StructLayout(LayoutKind.Sequential)]
struct POINT
{
public int X;
public int Y;
}
[StructLayout(LayoutKind.Sequential)]
struct RECT
{
public int left;
public int top;
public int right;
public int bottom;
}
[Serializable]
[StructLayout(LayoutKind.Sequential)]
struct WINDOWPLACEMENT
{
public int length;
public int flags;
public int showCmd;
public POINT ptMinPosition;
public POINT ptMaxPosition;
public RECT rcNormalPosition;
}
[DllImport("user32", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool GetWindowPlacement(IntPtr hWnd, ref WINDOWPLACEMENT lpwndpl);
[DllImport("user32", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool SetWindowPlacement(IntPtr hWnd, ref WINDOWPLACEMENT lpwndpl);
ウィンドウの現在の位置を取得するには (アプリを閉じるときに行う)、次のコードを使用します。
WINDOWPLACEMENT wp = new WINDOWPLACEMENT();
wp.length = Marshal.SizeOf(wp);
GetWindowPlacement(MyForm.Handle, ref wp);
レジストリは、アプリケーションの状態を永続化するための推奨される場所ではなくなったと述べたことを思い出してください。.NET で開発しているため、はるかに強力で用途の広いオプションを利用できます。上記で宣言されたWINDOWPLACEMENT
クラスはマークされているため、この情報をアプリケーションの設定にシリアル化し、次に開いたときに再ロードするのは[Serializable]
非常に簡単です。