web-dev-qa-db-fra.com

Comment déterminer sur quel moniteur mon programme Windows Forms .NET s'exécute?

J'ai une application Windows C # dont je veux m'assurer qu'elle s'affichera sur un deuxième moniteur si l'utilisateur la déplace vers un. Je dois enregistrer la taille, l'emplacement et l'état de la fenêtre du formulaire principal - que j'ai déjà gérés - mais j'ai également besoin de savoir sur quel écran il se trouvait lorsque l'utilisateur a fermé l'application.

J'utilise la classe Screen pour déterminer la taille de l'écran actuel, mais je ne trouve rien sur la façon de déterminer sur quel écran l'application s'exécutait.

Edit: Merci pour les réponses, tout le monde! Je voulais déterminer sur quel moniteur la fenêtre était allumée afin de pouvoir vérifier les limites appropriées au cas où l'utilisateur mettrait accidentellement la fenêtre en dehors de la zone de visualisation ou modifierait la taille de l'écran de sorte que le formulaire ne serait plus complètement visible.

45
Stephen Fletcher

Vous pouvez obtenir un tableau d'écrans que vous avez en utilisant ce code.

Screen[] screens = Screen.AllScreens;

Vous pouvez également déterminer sur quel écran vous vous trouvez, en exécutant ce code ( ceci est le formulaire Windows sur lequel vous vous trouvez)

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

en bref, consultez la classe Screen et les méthodes d'assistance statique, elles pourraient vous aider.

MSDN Link , n'a pas grand chose..Je vous suggère de jouer dans le code par vous-même.

59
Stan R.

Si vous vous souvenez de l'emplacement et de la taille de la fenêtre, cela suffira. Lorsque vous définissez la position sur la position précédemment utilisée, si elle se trouvait sur le deuxième moniteur, elle y retournerait.

Par exemple, si vous avez 2 moniteurs, tous deux de 1280 x 1024 et que vous définissez la position gauche de votre fenêtre à 2000 pixels, elle apparaîtra sur le deuxième moniteur (en supposant que le deuxième moniteur soit à droite du premier). :)

Si vous craignez que le deuxième moniteur ne soit pas là lors du prochain démarrage de l'application, vous pouvez utiliser cette méthode pour déterminer si votre fenêtre intersecte l'un des écrans:

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

Passez simplement l'emplacement souhaité de votre fenêtre et il vous dira s'il sera visible sur l'un des écrans. Prendre plaisir!

9
Jon Tackabury

Vous pouvez obtenir l'écran actuel avec

var s = Screen.FromControl(this);

this est le formulaire (ou tout contrôle sur le formulaire). Quant à savoir comment se souvenir, c'est un peu délicat, mais je choisirais l'index dans le tableau Screen.AllScreens, ou peut-être s.DeviceName. Dans les deux cas, vérifiez avant d'utiliser les paramètres au démarrage, pour éviter d'utiliser un moniteur déconnecté.

7
Henk Holterman

L'emplacement du formulaire vous indiquera sur quel écran le formulaire est activé. Je ne comprends pas vraiment pourquoi vous devez savoir sur quel écran il se trouve, car si vous le restaurez en utilisant l'emplacement que vous avez enregistré, il devrait simplement être restauré au même emplacement (vous pouvez peut-être développer pourquoi).

Sinon, vous pouvez faire quelque chose comme ceci:

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

Chaque écran a une propriété Bounds qui renvoie un rectangle. Vous pouvez utiliser la fonction IntersectsWith () pour déterminer si le formulaire se trouve dans l'écran.

En outre, ils fournissent essentiellement une fonction qui le fait également dans la classe Screen

Screen screen = Screen.FromControl(form);
5
Chap

Vous pouvez utiliser l'objet 'Screen': System.Windows.Forms.Screen

Commencez à jouer avec quelque chose comme ça:

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

Il peut vous procurer ce dont vous avez besoin

1
The Savage