C#:デスクトップ全体のサイズを取得しますか?

デスクトップ全体の大きさを知るにはどうしたらよいですか?**作業領域や画面解像度ではなく、1画面分の大きさです。各モニターが一部しか表示していない仮想デスクトップの幅と高さの合計を知りたいのです。

LINQを使えば、1つの式でデスクトップ全体のサイズを簡単に取得することができるのです。

Console.WriteLine(
    Screen.AllScreens.Select(screen=>screen.Bounds)
    .Aggregate(Rectangle.Union)
    .Size
);

私のオリジナルの回答は以下の通りです。


あなたが欲しいのは、こんな感じでしょうか。

int minx, miny, maxx, maxy;
minx = miny = int.MaxValue;
maxx = maxy = int.MinValue;

foreach(Screen screen in Screen.AllScreens){
    var bounds = screen.Bounds;
    minx = Math.Min(minx, bounds.X);
    miny = Math.Min(miny, bounds.Y);
    maxx = Math.Max(maxx, bounds.Right);
    maxy = Math.Max(maxy, bounds.Bottom);
}

Console.WriteLine("(width, height) = ({0}, {1})", maxx - minx, maxy - miny);

これだけでは全体像がつかめないことに注意してください。 複数のモニターをずらしたり、長方形でない形に配置することは可能です。 したがって、(minx, miny) と (maxx, maxy) の間のスペースがすべて見えるわけではない可能性があります。

EDIT:

今気づいたのですが、Rectangle.Unionを使うともう少しシンプルなコードになりそうです。

Rectangle rect = new Rectangle(int.MaxValue, int.MaxValue, int.MinValue, int.MinValue);

foreach(Screen screen in Screen.AllScreens)
    rect = Rectangle.Union(rect, screen.Bounds);

Console.WriteLine("(width, height) = ({0}, {1})", rect.Width, rect.Height);
解説 (1)

チェックする。

SystemInformation.VirtualScreen.Width
SystemInformation.VirtualScreen.Height
解説 (0)

これは質問に対する答えではなく、単にウィンドウのPoint(位置)を全画面で確認するための追加情報です。)

以下のコードを使用して、あるポイント(たとえば、ウィンドウの最後の既知の位置)がデスクトップ全体の境界内にあるかどうかを調べます。 もしそうでなければ、ウィンドウの位置をデフォルトの pBaseLoc にリセットします。

このコードでは、タスクバーや他のツールバーを考慮に入れていませんので、そこは自己責任でお願いします。

使用例:ウィンドウの場所をstation Aからデータベースに保存する。 ユーザーが2つのモニターを持つstation Bにログインし、ウィンドウを2番目のモニターに移動し、新しい場所を保存してログアウトします。 ステーションA**に戻ると、上記のコードが使用されていない限り、ウィンドウは表示されません。

私の更なる解決策は、ユーザーIDとステーションのIP(とwinLoc)をデータベースまたは与えられたアプリのローカルユーザープリファレンスファイルに保存し、そのステーションとアプリのユーザープリファレンスをロードすることを実装しました。

Point pBaseLoc = new Point(40, 40)
int x = -500, y = 140;
Point pLoc = new Point(x, y);
bool bIsInsideBounds = false;

foreach (Screen s in Screen.AllScreens)
{
    bIsInsideBounds = s.Bounds.Contains(pLoc);
    if (bIsInsideBounds) { break; }
}//foreach (Screen s in Screen.AllScreens)

if (!bIsInsideBounds) { pLoc = pBaseLoc;  }

this.Location = pLoc;
解説 (2)