2009-08-22 9 views
65

デスクトップ全体のサイズを調べるにはどうすればよいですか? 「作業領域」「画面解像度」はいずれも1つの画面しか参照していません。私は、各モニタが一部しか表示していない仮想デスクトップの幅と高さの合計を調べたいと思います。C#:デスクトップの完全なサイズを取得しますか?

+2

"デスクトップの完全サイズ"は、画面の配置方法によって異なる場合があります。それを計算する方法はわかりませんが、System.Windows.Forms.Screen.AllScreensを使用して各画面の数と解像度を把握することができます。 – Havenard

答えて

119

あなたは2つのオプションがあります。

  1. をPresentationFramework.dll

    SystemParameters.VirtualScreenWidth 
    SystemParameters.VirtualScreenHeight 
    
  2. システム。Windows.Forms.dll

    SystemInformation.VirtualScreen.Width 
    SystemInformation.VirtualScreen.Height 
    

あなたがWPFアプリケーションを開発する場合最初のオプションを使用してください。

+0

このような回答の詳細短く、正確で、美的に喜ばしい! – Bitterblue

26

この回答を最新のものにして、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); 
+2

私はウクライナのプログラマーです。私は、このコードがボックスから機能していることを確認しています。コピー&ペーストするだけです。 –

5

これは質問に答えていませんが、単にウィンドウのポイントに追加の洞察を追加します(場所)をすべての画面内に表示します)。

ポイント(たとえば、最後にわかったウィンドウの場所)がデスクトップ全体の範囲内にあるかどうかを確認するには、次のコードを使用します。そうでない場合は、ウィンドウの場所をデフォルトのにリセットします。pBaseLoc;

コードはTaskBarやその他のツールバーを考慮していません。

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

ユーザーIDとステーションのIP(& winLoc)を特定のアプリケーションのデータベースまたはローカルユーザーのprefsファイルに保存してから、そのステーション& appのユーザーprefに読み込みます。

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; 
+6

これが質問に答えることができないことを知っている場合は、なぜその質問に対する回答として投稿していますか?最初の文が警鐘を発したはずはありませんか? – Timwi

+1

これに対して、これは正確に私がこのトピックを検索したときに探していたものです –

14

チェック:

SystemInformation.VirtualScreen.Width 
SystemInformation.VirtualScreen.Height 
0

範囲はSystem.Drawingです。

次のような変数にこの

public System.Windows.Form.Screen[] GetScreens(){ 
    Screen[] screens = Screen.AllScreens; 
    return screens; 
} 

、あなたがスクリーン1を得ることができるよりも、2、などのような関数を作成することができます

System.Windows.Form.Screen[] screens = func.GetScreens(); 
System.Windows.Form.Screen screen1 = screens[0]; 

、あなたが境界を得ることができます

System.Drawing.Rectangle screen1Bounds = screen1.Bounds; 

このコードを使用すると、Widthのようなすべてのプロパティが表示されます。 、Heightなど

0

この方法では、左とトップの最安値を使用して画面を境界のすべてが含まれている四角形を返し、右と下の最高値...

static Rectangle GetDesktopBounds() { 
    var l = int.MaxValue; 
    var t = int.MaxValue; 
    var r = int.MinValue; 
    var b = int.MinValue; 
    foreach(var screen in Screen.AllScreens) { 
     if(screen.Bounds.Left < l) l = screen.Bounds.Left ; 
     if(screen.Bounds.Top < t) t = screen.Bounds.Top ; 
     if(screen.Bounds.Right > r) r = screen.Bounds.Right ; 
     if(screen.Bounds.Bottom > b) b = screen.Bounds.Bottom; 
    } 
    return Rectangle.FromLTRB(l, t, r, b); 
} 
+0

少し説明してください。 –

+0

すべての画面をループします。左端が変数 'l'より小さい場合、この新しい値に 'l'を設定します。下端が 'b'より大きい場合は、それを設定します。最終的な結果は、l、t、r、bが、表示されるデスクトップ全体の左上、上端、右端、および下端に設定されます。 – dynamichael

0

「本当の」画面サイズを得る最良の方法は、ビデオコントローラから直接値を取得することです。


using System; 
    using System.Management; 
    using System.Windows.Forms; 

    namespace MOS 
    { 
     public class ClassMOS 
     { 
      public static void Main() 
      { 
       try 
       { 
        ManagementObjectSearcher searcher = 
         new ManagementObjectSearcher("root\\CIMV2", 
         "SELECT * FROM Win32_VideoController"); 

        foreach (ManagementObject queryObj in searcher.Get()) 
        { 
         Console.WriteLine("CurrentHorizontalResolution: {0}", queryObj["CurrentHorizontalResolution"]); 
         Console.WriteLine("-----------------------------------"); 
         Console.WriteLine("CurrentVerticalResolution: {0}", queryObj["CurrentVerticalResolution"]); 
        } 
       } 
       catch (ManagementException e) 
       { 
        MessageBox.Show("An error occurred while querying for WMI data: " + e.Message); 
       } 
      } 
     } 
} 

これは、仕事をする必要があります;) 挨拶...

4

をあなたはこれを使用することができ、モニタの物理的なピクセルサイズを取得するには。

static class DisplayTools 
{ 
    [DllImport("gdi32.dll")] 
    static extern int GetDeviceCaps(IntPtr hdc, int nIndex); 

    private enum DeviceCap 
    { 
     Desktopvertres = 117, 
     Desktophorzres = 118 
    } 

    public static Size GetPhysicalDisplaySize() 
    { 
     Graphics g = Graphics.FromHwnd(IntPtr.Zero); 
     IntPtr desktop = g.GetHdc(); 

     int physicalScreenHeight = GetDeviceCaps(desktop, (int)DeviceCap.Desktopvertres); 
     int physicalScreenWidth = GetDeviceCaps(desktop, (int)DeviceCap.Desktophorzres); 

     return new Size(physicalScreenWidth, physicalScreenHeight); 
    } 


} 
関連する問題