2009-08-22 12 views
65

Wie finde ich die Größe des gesamten Desktops heraus? Nicht die "Arbeitsfläche" und nicht die "Bildschirmauflösung", die beide auf nur einen Bildschirm beziehen. Ich möchte die Gesamtbreite und -höhe des virtuellen Desktops herausfinden, von dem jeder Monitor nur einen Teil anzeigt.C#: Erhalten Sie vollständige Desktop-Größe?

+2

Vielleicht hängt die "vollständige Desktopgröße" davon ab, wie die Bildschirme positioniert sind. Nicht sicher, wie Sie das berechnen, aber Sie können immer noch die Anzahl der Bildschirme und die Auflösung jedes Bildschirms mit System.Windows.Forms.Screen.AllScreens abfangen. – Havenard

Antwort

119

Sie haben zwei Möglichkeiten:

  1. PresentationFramework.dll

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

    SystemInformation.VirtualScreen.Width 
    SystemInformation.VirtualScreen.Height 
    

Verwenden Sie die erste Option, wenn Sie eine WPF-Anwendung zu entwickeln.

+0

Mehr Antworten wie diese! Kurz, korrekt und ästhetisch! – Bitterblue

26

Ich denke, es ist Zeit, diese Antwort mit ein wenig LINQ zu aktualisieren, die es einfach macht, die gesamte Desktop-Größe mit einem einzigen Ausdruck zu erhalten.

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

Meine ursprüngliche Antwort folgt:


Ich denke, was Sie wollen, so etwas wie dieses:

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

Beachten Sie, dass dies nicht die ganze Geschichte erzählen. Es ist möglich, dass mehrere Monitore gestaffelt oder in einer nicht rechteckigen Form angeordnet sind. Daher kann es sein, dass nicht der gesamte Abstand zwischen (minx, miny) und (maxx, maxy) sichtbar ist.

EDIT:

Ich habe erkannt, dass der Code ein bisschen einfacher Rectangle.Union verwenden könnte:

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

Ich bin ukrainischer Programmierer. Ich überprüfe, dass dieser Code von der Box funktioniert. Einfach kopieren und einfügen. –

5

Das beantwortet nicht die Frage, sondern lediglich fügt einen zusätzlichen Einblick auf einem Point-Fenster (Standort) in allen Bildschirmen).

Verwenden Sie den folgenden Code, um herauszufinden, ob ein Punkt (z. B. die letzte bekannte Position des Fensters) innerhalb der Grenzen des gesamten Desktops liegt. Ist dies nicht der Fall, setzen Sie den Standort des Fensters auf den Standardwert pBaseLoc zurück;

Code berücksichtigt nicht die TaskBar oder andere Toolbars, die Sie selbst besitzen.

Beispiel Verwendung: Speichern Sie den Fensterstandort in einer Datenbank von Station A. Der Benutzer meldet sich in Station B mit 2 Monitoren an und verschiebt das Fenster zum zweiten Monitor, meldet sich beim Speichern des neuen Standorts ab. Zurück zu Station A und das Fenster würde nicht angezeigt werden, wenn der obige Code verwendet wird.

Meine weitere Lösung implementiert das Speichern der Benutzer-ID und IP-Adresse (& winLoc) zu Datenbank oder lokalen Benutzer Prefs-Datei für eine bestimmte App, laden Sie dann Benutzer Pref für diese Station & App.

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

Wenn Sie * wissen *, dass dies die Frage nicht beantwortet, warum veröffentlichen Sie es als Antwort auf die Frage? Hätte nicht der erste Satz eine Alarmglocke läuten sollen? – Timwi

+1

Auf der anderen Seite, das ist genau das, was ich suchte, als ich zu diesem Thema Suche –

14

Check:

SystemInformation.VirtualScreen.Width 
SystemInformation.VirtualScreen.Height 
0

Sie können die Grenzen von System.Drawing verwenden.

Sie eine Funktion wie diese

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

erstellen und als können Sie den Bildschirm ein, zwei, usw. in einer Variablen wie diese:

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

dann können Sie die Grenzen erhalten des Bildschirms:

System.Drawing.Rectangle screen1Bounds = screen1.Bounds; 

Mit diesem Code werden Sie alle Eigenschaften wie Width erhalten , Height usw.

0

Diese Methode das Rechteck zurück, die mit den niedrigsten Werten für Links und Oben, und die höchsten Werte für rechts und unten alle Bildschirme Grenzen enthält ...

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

Bitte erläutern Sie ein wenig. –

+0

Es durchläuft alle Bildschirme. Wenn die linke Kante kleiner als die Variable 'l' ist, wird 'l' auf diesen neuen Wert gesetzt, wenn die untere Kante größer als 'b' ist, dann wird diese gesetzt. Das Endergebnis ist l, t, r, b sind auf den linken, oberen, rechten und unteren Rand des gesamten sichtbaren Desktops eingestellt. – dynamichael

0

Ich denke, der beste Weg, um die "echte" Bildschirmgröße zu bekommen, ist, die Werte direkt vom Video-Controller zu bekommen.


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

Das die Arbeit machen sollte;) Grüße ...

4

Um die physische Pixelgröße des Monitors erhalten Sie diese nutzen können.

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


} 
Verwandte Themen