2009-07-13 18 views
31

Ich habe eine C# Windows-Anwendung, die ich sicherstellen möchte, wird auf einem zweiten Monitor angezeigt, wenn der Benutzer es zu einem verschiebt. Ich muss die Größe, den Standort und den Fensterstatus des Hauptformulars speichern - was ich bereits behandelt habe -, aber ich muss auch wissen, auf welchem ​​Bildschirm es war, als der Benutzer die Anwendung geschlossen hat.Wie kann ich feststellen, auf welchem ​​Monitor mein .NET Windows Forms-Programm ausgeführt wird?

Ich benutze die Screen-Klasse, um die Größe des aktuellen Bildschirms zu bestimmen, aber ich kann nichts finden, um festzustellen, auf welchem ​​Bildschirm die Anwendung ausgeführt wurde.

Edit: Danke für die Antworten, alle! Ich wollte herausfinden, auf welchem ​​Monitor das Fenster war, damit ich die Grenzen richtig prüfen konnte, falls der Benutzer das Fenster versehentlich außerhalb des Anzeigebereichs platziert oder die Bildschirmgröße so geändert hat, dass das Formular nicht mehr vollständig sichtbar ist.

+0

Ist dies nicht eine ähnliche Frage zu http://stackoverflow.com/questions/937298/restoring-window-size -position-with-multiple-monitors – sgmoore

Antwort

46

Sie können ein Array von Bildschirmen erhalten, die Sie mit diesem Code verwenden.

Screen[] screens = Screen.AllScreens; 

Sie können auch herausfinden, welchen Bildschirm Sie sind durch diesen Code ausgeführt wird (diese ist die Fenster bilden Sie sind)

Screen screen = Screen.FromControl(this); //this is the Form class 

in der Screen-Klasse kurz überprüfen und statische Hilfsmethoden, könnten sie Ihnen helfen.

MSDN Link, hat nicht viel..Ich schlage vor, herum im Code selbst zu verwirren.

+0

Ja, die Leute scheinen zu vergessen, dass Form von Control erbt , so würde Screen.FromControl daran arbeiten. – Powerlord

+4

Vielleicht sollte ich das umformulieren ... Form erbt von ContainerControl, das von ScrollableControl erbt, das von Control erbt. – Powerlord

+0

Das ist völlig falsch – Janie

6

Wenn Sie sich an den Standort und die Größe des Fensters erinnern, reicht das. Wenn Sie die Position auf die zuvor verwendete Position einstellen, wird sie, wenn sie sich zufällig auf dem zweiten Monitor befindet, dorthin zurückgehen.

Zum Beispiel, wenn Sie zwei Monitore haben, so bemessen, beide 1280x1024 und Sie Ihre Fenster der linken Position 2000px zu sein, ist es auf dem zweiten Monitor angezeigt wird (vorausgesetzt, der zweite Monitor rechts von der ersten ist.) :)

wenn Sie sich Sorgen über den zweiten Monitor sind nicht dort zu sein, wenn die Anwendung das nächste Mal gestartet wird, können Sie diese Methode verwenden, um festzustellen, ob Ihre Fenster alle Bildschirme schneidet:

private bool isWindowVisible(Rectangle rect) 
{ 
    foreach (Screen screen in Screen.AllScreens) 
    { 
     if (screen.Bounds.IntersectsWith(rect)) 
      return true; 
    } 
    return false; 
} 

einfach passieren in die gewünschte Position Ihres Fensters und es wird Ihnen sagen, ob es auf einem der Bildschirme sichtbar sein wird. Genießen!

+1

zugestimmt, aber einige Überprüfung beim Start wäre nett, so dass nach einer Neukonfiguration Ihre App wird nicht außerhalb aller Monitore sein –

+0

Eigentlich, wenn jemand den zweiten Monitor entfernt und Ihre Anwendung wird versuchen, zu Wenn zwei Monitore vorhanden waren, verwenden Sie "Oben/Links" aus der vorherigen Sitzung. Windows wird dann automatisch auf den ersten Monitor verschoben. Sie müssen die Methode isWindowVisible also praktisch nicht aufrufen. – SolutionYogi

+0

Ich stimme zu Henk - überprüfen Sie das Beispiel, das ich hinzugefügt habe, damit Sie überprüfen können, ob Ihr Fenster sichtbar ist. :) –

0

Sie können über den 'Screen' Objekt: System.Windows.Forms.Screen

Beginnen Sie mit so etwas wie dieses spielen:

 Screen[] screens = Screen.AllScreens; 
     for (int i = 0; i < screens.Length ; i++) 
     { 
      Debug.Print(screens[i].Bounds.ToString()); 
      Debug.Print(screens[i].DeviceName); 
      Debug.Print(screens[i].WorkingArea.ToString()); 
     } 

Es kann Sie bekommen, was Sie brauchen

4

Sie können den aktuellen Bildschirm mit

var s = Screen.FromControl(this); 

, wo this die Form (oder eine Kontrolle über die Form). Um darüber nachzudenken, ist das ein wenig schwierig, aber ich würde für den Index im Screen.AllScreens-Array gehen, oder vielleicht an DeviceName. Überprüfen Sie in jedem Fall, bevor Sie die Einstellungen beim Start verwenden, um die Verwendung eines Monitors zu verhindern, der getrennt wurde.

+1

Ich würde nicht für den DeviceName gehen, der DeviceName könnte jederzeit ändern, sagen, wenn Sie eine neue Grafikkarte oder Monitor bekommen ... –

+0

Ich bekomme sie als \\. \ DISPLAY1 und \\. \ DISPLAY2, auf Vista. Aber es könnte für XP anders sein, ich bin mir nicht sicher. –

+0

Ich stimme zu, niemand ist wirklich sicher. Deshalb würde ich es nicht verwenden. :) –

3

Die Position des Formulars zeigt Ihnen an, auf welchem ​​Bildschirm das Formular angezeigt wird. Ich verstehe nicht wirklich, warum Sie wissen müssen, auf welchem ​​Bildschirm es sich befindet, denn wenn Sie es mit dem Speicherort wiederherstellen, den Sie gespeichert haben, sollte es nur am selben Ort wiederhergestellt werden (vielleicht können Sie warum erweitern).

Ansonsten können Sie etwas tun:

Screen[] scr = Screen.AllScreens; 
scr[i].Bounds.IntersectsWith(form.Bounds); 

Jeder Bildschirm hat eine Bounds-Eigenschaft, die ein Rechteck zurück. Sie können die IntersectsWith() - Funktion verwenden, um festzustellen, ob sich das Formular innerhalb des Bildschirms befindet.

Darüber hinaus bieten sie im Grunde eine Funktion, die dies auch auf der Screen-Klasse tut

Screen screen = Screen.FromControl(form); 
Verwandte Themen