web-dev-qa-db-ja.com

デュアルモニターシナリオでフォームを「追加」モニターに確実に表示するにはどうすればよいですか?

セカンドスクリーンに表示したいフォームがあるアプリがあります。

つまり、アプリケーションが画面Aで実行されており、メニューをクリックしてフォームを表示すると、画面Bに表示されます。アプリケーションが画面Bで実行されており、メニューをクリックしてフォームを表示すると、画面Aに表示されます。

21
Mohsan

Screen クラスを使用して元のフォームが表示されていない画面を検索し、その画面のLocationに基づいて2番目のフォームのBoundsプロパティを設定する必要があります。

例えば:

var myScreen = Screen.FromControl(originalForm);
var otherScreen = Screen.AllScreens.FirstOrDefault(s => !s.Equals(myScreen)) 
               ?? myScreen;
otherForm.Left = otherScreen.WorkingArea.Left + 120;
otherForm.Top = otherScreen.WorkingArea.Top + 120;

これは任意の数の画面で機能します。

Windowsが2つの小さな画面ではなく1つの大きな画面を見るようにビデオカードが構成されている可能性があることに注意してください。その場合、これははるかに困難になります。

43
SLaks

以下は、任意のモニターにフォームを表示できるようにする関数です。現在のシナリオでは、これをshowOnMonitor(1);と呼ぶことができます。

基本的に、Screen.AllScreensから画面情報を取得し、それぞれのサイズを取得して、必要な場所にフォームを配置する必要があります

function void showOnMonitor(int showOnMonitor) 
{ 
    Screen[] sc; 
    sc = Screen.AllScreens; 

    Form2 f = new Form2(); 

    f.FormBorderStyle = FormBorderStyle.None; 
    f.Left = sc[showOnMonitor].Bounds.Left; 
    f.Top = sc[showOnMonitor].Bounds.Top; 
    f.StartPosition = FormStartPosition.Manual; 

    f.Show(); 
}

実際に2つの画面があることを確認するために検証を行うことを忘れないでください。そうしないと、sc[showOnMonitor]にアクセスすると例外がスローされます

19
Chris

OnLoadメソッドで、ウィンドウの場所を変更します。

protected void Form1_OnLoad(...) {
    showOnMonitor(1);
}

private void showOnMonitor(int showOnMonitor) 
{ 
    Screen[] sc; 
    sc = Screen.AllScreens; 
    if (showOnMonitor >= sc.Length) {
        showOnMonitor = 0;
    }

    this.StartPosition = FormStartPosition.Manual; 
    this.Location = new Point(sc[showOnMonitor].Bounds.Left, sc[showOnMonitor].Bounds.Top);
    // If you intend the form to be maximized, change it to normal then maximized.
    this.WindowState = FormWindowState.Normal;
    this.WindowState = FormWindowState.Maximized;
}
12
Nap

これをXNA 4デュアルスクリーンアプリケーション(フルスクリーンXNAゲームウィンドウ+ WinForm)に使用しました

Form_Load()メソッドに、次のコードを配置します。

var primaryDisplay = Screen.AllScreens.ElementAtOrDefault(0);  
var extendedDisplay = Screen.AllScreens.FirstOrDefault(s => s != primaryDisplay) ?? primaryDisplay;

this.Left = extendedDisplay.WorkingArea.Left + (extendedDisplay.Bounds.Size.Width / 2) - (this.Size.Width / 2);
this.Top = extendedDisplay.WorkingArea.Top + (extendedDisplay.Bounds.Size.Height / 2) - (this.Size.Height / 2);
1
Eric