Trouver les dimensions de l'écran actif (primaire ou secondaire) [Résolu]

MGD Software 76 Messages postés vendredi 1 septembre 2006Date d'inscription 20 avril 2018 Dernière intervention - 1 sept. 2017 à 20:04 - Dernière réponse : Whismeril 11406 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 19 avril 2018 Dernière intervention
- 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 ??
Afficher la suite 

5 réponses

Répondre au sujet
MGD Software 76 Messages postés vendredi 1 septembre 2006Date d'inscription 20 avril 2018 Dernière intervention - Modifié par MGD Software le 1/09/2017 à 20:41
0
Utile
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...
Commenter la réponse de MGD Software
MGD Software 76 Messages postés vendredi 1 septembre 2006Date d'inscription 20 avril 2018 Dernière intervention - 2 sept. 2017 à 08:20
0
Utile
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 ??
Commenter la réponse de MGD Software
Commenter la réponse de Whismeril
MGD Software 76 Messages postés vendredi 1 septembre 2006Date d'inscription 20 avril 2018 Dernière intervention - 2 sept. 2017 à 10:04
0
Utile
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...
Commenter la réponse de MGD Software
Whismeril 11406 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 19 avril 2018 Dernière intervention - 2 sept. 2017 à 12:52
0
Utile
De rien
Commenter la réponse de Whismeril

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.