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?
Antwort
Sie haben zwei Möglichkeiten:
PresentationFramework.dll
SystemParameters.VirtualScreenWidth SystemParameters.VirtualScreenHeight
System.Windows.Forms.dll
SystemInformation.VirtualScreen.Width SystemInformation.VirtualScreen.Height
Verwenden Sie die erste Option, wenn Sie eine WPF-Anwendung zu entwickeln.
Mehr Antworten wie diese! Kurz, korrekt und ästhetisch! – Bitterblue
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);
Ich bin ukrainischer Programmierer. Ich überprüfe, dass dieser Code von der Box funktioniert. Einfach kopieren und einfügen. –
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;
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
Auf der anderen Seite, das ist genau das, was ich suchte, als ich zu diesem Thema Suche –
Check:
SystemInformation.VirtualScreen.Width
SystemInformation.VirtualScreen.Height
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.
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);
}
Bitte erläutern Sie ein wenig. –
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
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 ...
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);
}
}
- 1. Programmatisch vollständige Ruby-Version erhalten?
- 2. Vollständige Abfragezeichenfolge in C# ASP.NET
- 3. So erhalten Sie die vollständige Hilfe im Schaufenster in Powershell
- 4. django-Speicher erhalten Sie die vollständige URL S3
- 5. So erhalten Sie vollständige Antwort für Groovy RestClient fehlgeschlagen Antwort
- 6. So erhalten Sie die vollständige Liste der Unity-Shader-Eigenschaften
- 7. So erhalten Sie das vollständige Pfadverzeichnis von der Dateiauswahl
- 8. Holen Sie sich die vollständige laufende Prozessliste (Visual C++)
- 9. Eine vollständige Kopie der WHOIS-Datenbank erhalten
- 10. So lesen Sie vollständige Paketdaten von SerialPort in C#
- 11. Vollständige Disassemblierung einer ausführbaren Binärdatei erhalten
- 12. YouTube API | Keine vollständige JSON-Antwort erhalten
- 13. Vollständige C++ - Compiler-Befehlszeile abrufen
- 14. Wie kann ich die vollständige Aufrufhierarchie eines Java-Quellcodes erhalten?
- 15. Finden Sie die vollständige Funktionsdefinition in C++ freigegebene Objektdatei
- 16. So rufen Sie das vollständige Wörterbuch in C auf #
- 17. Wie erhalten Sie den vollständigen Hostnamen in C#?
- 18. Erhalten Sie Netzwerkauslastung in C#
- 19. C# - Vollständige Rückkehr von der Basismethode
- 20. Vollständige C++ - Pipeline als Blackbox von R
- 21. youtube api C# Video vollständige Metadaten
- 22. Wie vollständige URL mit Request.Url in asp.net erhalten?
- 23. Keine vollständige Ausgabe für das Programm in Eclipse erhalten
- 24. Erhalten vollständige Liste der verfügbaren Befehle für DTE.ExecuteCommand
- 25. Vollständige URL mit jQuery einschließlich Parametern nach Fragezeichen erhalten?
- 26. asp.net MVC - wie vollständige lokale und globale Ressourcen erhalten
- 27. Erhalten Sie E-Mail-Adresse Outlook durch C#
- 28. Warum ich nicht die vollständige Abhängigkeit erhalten habe
- 29. Vollständige WKWebView-URL
- 30. Facebook Api Graph kann nicht vollständige Informationen erhalten (JS SDK)
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