Trouver les dimensions de l'écran actif (primaire ou secondaire)

Résolu
MGD Software Messages postés 186 Date d'inscription vendredi 1 septembre 2006 Statut Membre Dernière intervention 23 avril 2022 - 1 sept. 2017 à 20:04
Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 - 2 sept. 2017 à 12:52
Bonjour,

J'ai une petit routine qui mémorise la position des fenêtres à leur fermeture et qui les replace à leur réouverture.
Le problème se pose lorsque entre les deux, la taille de l'écran a changé : le deuxième écran n'est plus présent, ou l'utilisateur a réduit la résolution. Du coup, il arrive que la routine place la fenêtre en dehors de l'écran, ce qui est très désagréable et difficilement récupérable (à moins de faire Alt-Espace, flèche bas, Entrée, puis de bouger la souris dans tous les sens jusqu'à ce que la fenêtre apparaisse - C'est une manip que peu de gens connaissent).

Je prévois donc dans ma routine de tester la position et les dimensions mémorisées avant de les appliquer, et éventuellement de replacer la fenêtre au centre de l'écran principal.

Oui mais voilà : impossible (pour moi) de déterminer sur quel écran on est et quelles sont les dimensions de ce dernier.

Pour l'écran principal, pas de problème, puisque le la classe Screen fournit ses dimensions avec Screen.PrimaryScreen et Screen.PrimaryScreen.WorkingArea;

Mais pour l'écran secondaire, rien à faire. J'ai tenté d'utiliser Screen.GetWorkingArea, mais cela me ramène toujours les dimensions de l'écran primaire, même si le point de référence fourni est sur l'écran secondaire. Voici le petit bout de code que j'ai utilisé pour les tests :
        private void btn_Test_Click(object sender, EventArgs e)
        {
            int top = this.Top;
            int left = this.Left;
            int width = this.Width;
            int height = this.Height; 
            Rectangle display = Screen.GetWorkingArea(new Rectangle(top, left, width, height));
            txt_result.Text = String.Format("Taille écran :\r\nHaut = {0}\r\nGauche = {1}\r\nLargeur = {2}\r\nHauteur = {3}\r\n\r\n",
                                            display.Top, display.Left, display.Width, display.Height)
                            + String.Format("Position fenêtre :\r\nHaut = {0}\r\nGauche = {1}\r\nLargeur = {2}\r\nHauteur = {3}",
                                            top, left, width, height); ;
        }

Par exemple, je mets la fenêtre au milieu de l'écran secondaire, et j'obtiens :
Taille écran :
Haut = 0
Gauche = 0
Largeur = 1680
Hauteur = 1020

Position fenêtre :
Haut = 175
Gauche = 2324
Largeur = 486
Hauteur = 542

Or mon écran secondaire est un 4:3 en 1280 x 1024 !
La position gauche de la fenêtre est correcte, puisque c'est un bureau étendu et que mon écran secondaire est à droite. Mais du coup, la feuille serait supposée hors écran si on prend en compte la largeur écran retournée, alors qu'en fait elle ne l'est pas.

Quelqu'un connait une méthode pour détecter les dimensions de l'écran sur lequel est la feuille, et sa position sur cet écran ??

5 réponses

MGD Software Messages postés 186 Date d'inscription vendredi 1 septembre 2006 Statut Membre Dernière intervention 23 avril 2022 2
Modifié le 1 sept. 2017 à 20:41
J'ai trouvé !
en changeant les mots clés de recherche, j'ai trouvé sur un forum concurrent en anglais la solution suivante:
            foreach (var screen in Screen.AllScreens)
            {
                // For each screen, add the screen properties to a list box.
                Console.WriteLine("Device Name: " + screen.DeviceName);
                Console.WriteLine("Bounds: " + screen.Bounds.ToString());
                Console.WriteLine("Type: " + screen.GetType().ToString());
                Console.WriteLine("Working Area: " + screen.WorkingArea.ToString());
                Console.WriteLine("Primary Screen: " + screen.Primary.ToString());
                Console.WriteLine();
            }

Ce qui donne dans la fenêtre de sortie :

Device Name: \\.\DISPLAY1
Bounds: {X=0,Y=0,Width=1680,Height=1050}
Type: System.Windows.Forms.Screen
Working Area: {X=0,Y=0,Width=1680,Height=1020}
Primary Screen: True

Device Name: \\.\DISPLAY2
Bounds: {X=1680,Y=0,Width=1280,Height=1024}
Type: System.Windows.Forms.Screen
Working Area: {X=1680,Y=0,Width=1280,Height=1024}
Primary Screen: False

J'ai donc tout ce qu'il me faut pour vérifier que la feuille est dans un des écrans.
J'avais pourtant passé un temps non négligeable sur le net avant de poster ma demande...
1
Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 656
2 sept. 2017 à 09:15
1
MGD Software Messages postés 186 Date d'inscription vendredi 1 septembre 2006 Statut Membre Dernière intervention 23 avril 2022 2
2 sept. 2017 à 10:04
Whaoo !
Le diction dit : "Mieux vaut un qui sait que dix qui cherchent".
Ce post répond complètement à mon problème, puisqu'il évoque le but même de ma recherche et en fournit la solution.

J'avais ce niveau de connaissance pour le VB6 il y a dix ans.
À mon âge, c'est un peu dur de repartir quasiment à zéro.
Mais on dit qu'apprendre les langues est un excellent remède contre la maladie d'Alzheimer. Et le C# me parait aussi ardu que le Mandarin.
Mais j'y arriverai !

Merci encore pour le coup de pouce. Je risque d'en avoir besoin d'autres dans un avenir proche...
1
MGD Software Messages postés 186 Date d'inscription vendredi 1 septembre 2006 Statut Membre Dernière intervention 23 avril 2022 2
2 sept. 2017 à 08:20
Oups !
J'ai parlé un peu trop vite.
Je suis maintenant en mesure de détecter les différents écrans et leurs dimensions.
Mais comment savoir sur lequel est ma fenêtre ??
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 656
2 sept. 2017 à 12:52
De rien
0
Rejoignez-nous