web-dev-qa-db-ja.com

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

デスクトップ全体のサイズを確認するにはどうすればよいですか? Not「作業領域」およびnot「画面解像度」。どちらも1つの画面のみを参照します。各モニターが一部のみを表示している仮想デスクトップの幅と高さの合計を調べたい。

74
Timwi

次の2つのオプションがあります。

  1. PresentationFramework.dll

    SystemParameters.VirtualScreenWidth   
    SystemParameters.VirtualScreenHeight
    
  2. System.Windows.Forms.dll

    SystemInformation.VirtualScreen.Width   
    SystemInformation.VirtualScreen.Height
    

WPFアプリケーションを開発する場合は、最初のオプションを使用します。

126
Dennis

少しの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)の間のすべてのスペースが表示されるわけではない場合があります。

編集:

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);
28
P Daddy

チェック:

SystemInformation.VirtualScreen.Width
SystemInformation.VirtualScreen.Height
16
chris LB

モニターの物理ピクセルサイズを取得するには、これを使用できます。

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);
    }


}
6
Andreas

これは質問に答えませんが、すべての画面内のウィンドウのポイント(位置)に関する追加の洞察を追加するだけです。

以下のコードを使用して、ポイント(ウィンドウの最後の既知の位置など)がデスクトップ全体の境界内にあるかどうかを確認します。そうでない場合は、ウィンドウの場所をデフォルトにリセットしますpBaseLoc;

コードは、タスクバーや他のツールバーを考慮していません。

使用例:station Aからウィンドウの場所をデータベースに保存します。ユーザーは、2つのモニターでステーションBにログインし、ウィンドウを2番目のモニターに移動して、新しい場所を保存してログアウトします。 station 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;
6
TechStuffBC

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;

このコードを使用すると、WidthHeightなどのすべてのプロパティを取得できます。

1
JD - DC TECH

このメソッドは、LeftとTopの最小値、RightとBottomの最大値を使用して、画面のすべての境界を含む長方形を返します...

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);
}
1
dynamichael

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


    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);
                }
            }
        }
}

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

1
core.tweaks

依存関係のない仮想ディスプレイのサイズを取得します

public enum SystemMetric
{
    VirtualScreenWidth = 78, // CXVIRTUALSCREEN 0x0000004E 
    VirtualScreenHeight = 79, // CYVIRTUALSCREEN 0x0000004F 
}

[DllImport("user32.dll")]
public static extern int GetSystemMetrics(SystemMetric metric);

public static Size GetVirtualDisplaySize()
{
    var width = GetSystemMetrics(SystemMetric.VirtualScreenWidth);
    var height = GetSystemMetrics(SystemMetric.VirtualScreenHeight);

    return new Size(width, height);
}
0
Konstantin S.