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

Messages postés
98
Date d'inscription
vendredi 1 septembre 2006
Dernière intervention
24 octobre 2018
- - Dernière réponse : Whismeril
Messages postés
12365
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
10 décembre 2018
- 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 

Votre réponse

5 réponses

Messages postés
98
Date d'inscription
vendredi 1 septembre 2006
Dernière intervention
24 octobre 2018
0
Merci
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
Messages postés
98
Date d'inscription
vendredi 1 septembre 2006
Dernière intervention
24 octobre 2018
0
Merci
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
Messages postés
12365
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
10 décembre 2018
Commenter la réponse de Whismeril
Messages postés
98
Date d'inscription
vendredi 1 septembre 2006
Dernière intervention
24 octobre 2018
0
Merci
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
Messages postés
12365
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
10 décembre 2018
0
Merci
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.