2013-11-23 6 views
5

Ich versuche, die Größe meines primären Bildschirms zu bestimmen, damit ich sein Bild erfassen kann. Mein Setup ist ein Laptop mit einem 1600x900 Display und einem externen Monitor mit 1920x1080. Der Code, der die Größe erreicht, läuft unter Windows gut, liefert aber unter Ubuntu (mit MonoDevelop) das falsche Ergebnis.C# und Ubuntu - Wie bekomme ich die Größe des primären Bildschirms?

Rectangle capture_rect = System.Windows.Forms.Screen.PrimaryScreen.Bounds; 
    Console.WriteLine("width={0} height={1}", capture_rect.Height, capture_rect.Width); 

Das Ergebnis auf Ubuntu ist "width = 3520 height = 1080". Wenn ich den externen Monitor abziehe, bekomme ich das korrekte Ergebnis, nämlich "width = 1600 height = 900". Irgendeine Idee warum ich bei Ubuntu mit mehreren Displays den falschen Wert bekomme?

+0

Offenbar denkt Ubuntu, dass Ihr externer Monitor der primäre Bildschirm ist. Haben Sie sich die Bildschirmeigenschaften von Ubuntu angesehen, um zu bestätigen, dass sie wie erwartet konfiguriert sind (der externe Monitor ist nicht der primäre Bildschirm)? – varocarbas

+0

Der Rückgabewert 3520x1080 ist ein Rechteck, das die Größe beider Anzeigen umfasst. Wenn ich zu Systemeinstellungen> Anzeigen gehe, sagt es nichts über primäre oder sekundäre Anzeige, aber meine "Launcher-Platzierung" ist für meine Laptop-Anzeige eingestellt. Gibt es woanders sollte ich nach Bildschirmeigenschaften suchen? – Ravi

+0

Leider bin ich nicht so erfahren in Mono/Ubuntu und habe jetzt keinen Ubuntu Computer bei mir; Dies war nur ein allgemeiner Vorschlag (d. h. das wahrscheinlichste Problem ist, dass PrimaryScreen.Bounds tatsächlich richtig berechnet wird, aber auf einen anderen Bildschirm zeigt). In Ihrer Situation würde ich einige Tests mit allen von der Screen-Klasse erkannten Bildschirmen durchführen, um zu sehen, wie sie gespeichert/erkannt werden; würde auch etwas in den Ubuntu-Foren recherchieren. Entschuldigung, kann aber nicht weiter helfen. – varocarbas

Antwort

3

Anstatt .NET zu verwenden, um die Bildschirmabmessungen zu erhalten, habe ich Linux "xrandr" verwendet. Hier ist mein Code:

public Rectangle GetDisplaySize() 
{ 
    // Use xrandr to get size of screen located at offset (0,0). 
    System.Diagnostics.Process p = new System.Diagnostics.Process(); 
    p.StartInfo.UseShellExecute = false; 
    p.StartInfo.RedirectStandardOutput = true; 
    p.StartInfo.FileName = "xrandr"; 
    p.Start(); 
    string output = p.StandardOutput.ReadToEnd(); 
    p.WaitForExit(); 
    var match = System.Text.RegularExpressions.Regex.Match(output, @"(\d+)x(\d+)\+0\+0"); 
    var w = match.Groups[1].Value; 
    var h = match.Groups[2].Value; 
    Rectangle r; 
    r.Width = int.Parse(w); 
    r.Height = int.Parse(h); 
    Console.WriteLine ("Display Size is {0} x {1}", w, h); 
    return r; 
} 
Verwandte Themen