2012-05-09 5 views
1

私は2台のモニターを持っていますので、フォームの位置を保存する必要があり、画面が閉じた場所に表示されるはずです。フォームの位置とそれが表示される画面を取得し、次にフォームが表示されたときにそれを復元するにはどうすればよいですか?

誰かが画面を取得する方法を提案できますが、フォームの読み込み時にフォームが閉じられた画面に表示されますか?

設定をレジストリに保存します。

+0

http://stackoverflow.com/questions/105932/how-to-record-window-position-in-winforms-application-settingsの複製がありません –

+0

いいえ、私は境界線などを保存する方法を知っていますが、質問はそれが閉じられた場所にフォームapearを作る方法 –

+0

これを確認してください:http://stackoverflow.com/questions/2561104/c-sharp-winform-show-form-in-second-screen-and-vice-versa – kaze

答えて

0

最も簡単な方法はGetWindowPlacement functionです。これは、ウィンドウの画面上の座標に関する情報を含むWINDOWPLACEMENT structureを返します。

この機能を使用する代わりにForm.Locationプロパティは、複数のモニタ、最小化したウィンドウ、妙に配置タスクバーで体験しましょう問題など

は攻撃のルートはときにアプリケーションGetWindowPlacement関数を呼び出すことであろう解決アプリケーションの状態を保存するための推奨された場所ではなくなりました)、アプリケーションが再オープンされたときに、対応するSetWindowPlacement functionを呼び出すと、次のようになります。ウィンドウを元の位置に戻します。

これらは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]とマークされているので、この情報をapplication settingsにシリアル化して、次に開くときにリロードするのは非常に簡単です。

0

私は同じような機能を何度も実装しました。フォームが閉じられたときにForm.WindowStateForm.SizeおよびForm.Loactionのプロパティを保存し、フォームを開いたときにそれらを復元するだけです。

+0

しかし、 Form.DesctopBoundsを保存すると、それは同じではありませんか? –

+0

わかりませんが、同じかもしれません。とにかく、サイズと場所を保存することも私のために働いた。 –

関連する問題