web-dev-qa-db-ja.com

.NET Windowsフォームプログラムが実行されているモニターを確認するにはどうすればよいですか?

ユーザーがC#のWindowsアプリケーションを2つ目のモニターに移動したときに、そのモニターが2つ目のモニターに表示されるようにする必要があります。メインフォームのサイズ、場所、ウィンドウの状態(既に処理済み)を保存する必要がありますが、ユーザーがアプリケーションを閉じたときに表示されていた画面も知る必要があります。

現在の画面のサイズを判別するためにScreenクラスを使用していますが、アプリケーションが実行されている画面を判別する方法について何も見つかりません。

編集:皆さん、回答ありがとうございます!ユーザーが誤ってウィンドウを表示領域外に置いたり、フォームが完全に表示されないように画面サイズを変更した場合に備えて、適切な境界チェックを実行できるように、ウィンドウがオンになっていたモニターを特定したいと思いました。

45

このコードを使用して、画面の配列を取得できます。

Screen[] screens = Screen.AllScreens;

このコードを実行することで、現在の画面を確認することもできます(thisは、現在のウィンドウフォームです)

Screen screen = Screen.FromControl(this); //this is the Form class

つまり、Screenクラスと静的ヘルパーメソッドを確認してください。

MSDNリンク 、あまりありません。自分でコードをいじることをお勧めします。

59
Stan R.

ウィンドウの位置とサイズを覚えていれば、それで十分です。以前に使用した位置に設定すると、たまたま2番目のモニター上にあると、そこに戻ります。

たとえば、サイズが1280x1024の2つのモニターがあり、ウィンドウの左の位置を2000pxに設定した場合、2番目のモニターに表示されます(2番目のモニターが最初のモニターの右側にあると想定しています)。

次回アプリケーションを起動したときに2番目のモニターが表示されないことが心配な場合は、このメソッドを使用して、ウィンドウが画面と交差するかどうかを判断できます。

private bool isWindowVisible(Rectangle rect)
{
    foreach (Screen screen in Screen.AllScreens)
    {
        if (screen.Bounds.IntersectsWith(rect))
            return true;
    }
    return false;
}

ウィンドウの目的の場所を渡すだけで、画面の1つに表示されるかどうかがわかります。楽しい!

9
Jon Tackabury

あなたは現在の画面を得ることができます

var s = Screen.FromControl(this);

ここで、thisはフォーム(またはフォーム上の任意のコントロール)です。それを覚える方法については少しトリッキーですが、Screen.AllScreens配列またはおそらくs.DeviceNameのインデックスに行きます。どちらの場合も、起動時に設定を使用する前に確認し、切断されたモニターを使用しないようにします。

7
Henk Holterman

フォームの場所によって、フォームがどの画面にあるかがわかります。保存されている場所を使用して復元する場合は、同じ場所に復元する必要があるので、なぜそれがどの画面にあるのかを知る必要がある理由が本当にわかりません(多分、理由を拡張できるでしょう)。

それ以外の場合は、次のようなことができます。

Screen[] scr = Screen.AllScreens;
scr[i].Bounds.IntersectsWith(form.Bounds);

各画面には、四角形を返すBoundsプロパティがあります。 IntersectsWith()関数を使用して、フォームが画面内にあるかどうかを判別できます。

また、基本的にはScreenクラスでもこれを行う関数を提供します

Screen screen = Screen.FromControl(form);
5
Chap

'Screen'オブジェクトを使用できます:System.Windows.Forms.Screen

次のようなもので遊んでみましょう:

        Screen[] screens = Screen.AllScreens;
        for (int i = 0; i < screens.Length ; i++)
        {
            Debug.Print(screens[i].Bounds.ToString());
            Debug.Print(screens[i].DeviceName);
            Debug.Print(screens[i].WorkingArea.ToString());
        }

必要なものを手に入れるかもしれません

1
The Savage