Comment obtenir la taille de l’écran actuel dans WPF?

Je sais que je peux obtenir la taille de l’écran primaire en utilisant

System.Windows.SystemParameters.PrimaryScreenWidth; System.Windows.SystemParameters.PrimaryScreenHeight; 

Mais comment puis-je obtenir la taille de l’écran actuel? (Les utilisateurs multi-écrans n’utilisent pas toujours l’écran principal et tous les écrans n’utilisent pas la même résolution, non?)

Ce serait bien de pouvoir accéder à la taille de XAML, mais le faire à partir du code (C #) suffirait.

Autant que je sache, il n’y a pas de fonction WPF native pour obtenir les dimensions du moniteur actuel. Au lieu de cela, vous pouvez utiliser les fonctions de surveillance multi-écrans natives de PInvoke, les envelopper dans une classe gérée et exposer toutes les propriétés dont vous avez besoin pour les utiliser depuis XAML.

J’ai créé un petit wrapper autour de l’écran à partir de System.Windows.Forms, actuellement tout fonctionne … Je ne suis pas sûr des “pixels indépendants du périphérique”.

 public class WpfScreen { public static IEnumerable AllScreens() { foreach (Screen screen in System.Windows.Forms.Screen.AllScreens) { yield return new WpfScreen(screen); } } public static WpfScreen GetScreenFrom(Window window) { WindowInteropHelper windowInteropHelper = new WindowInteropHelper(window); Screen screen = System.Windows.Forms.Screen.FromHandle(windowInteropHelper.Handle); WpfScreen wpfScreen = new WpfScreen(screen); return wpfScreen; } public static WpfScreen GetScreenFrom(Point point) { int x = (int) Math.Round(point.X); int y = (int) Math.Round(point.Y); // are x,y device-independent-pixels ?? System.Drawing.Point drawingPoint = new System.Drawing.Point(x, y); Screen screen = System.Windows.Forms.Screen.FromPoint(drawingPoint); WpfScreen wpfScreen = new WpfScreen(screen); return wpfScreen; } public static WpfScreen Primary { get { return new WpfScreen(System.Windows.Forms.Screen.PrimaryScreen); } } private readonly Screen screen; internal WpfScreen(System.Windows.Forms.Screen screen) { this.screen = screen; } public Rect DeviceBounds { get { return this.GetRect(this.screen.Bounds); } } public Rect WorkingArea { get { return this.GetRect(this.screen.WorkingArea); } } private Rect GetRect(Rectangle value) { // should x, y, width, height be device-independent-pixels ?? return new Rect { X = value.X, Y = value.Y, Width = value.Width, Height = value.Height }; } public bool IsPrimary { get { return this.screen.Primary; } } public ssortingng DeviceName { get { return this.screen.DeviceName; } } } 

Voici budy. Cela ne vous donnera que la largeur et la hauteur de la zone de travail

 System.Windows.SystemParameters.WorkArea.Width System.Windows.SystemParameters.WorkArea.Height 

Prenez le temps de parcourir les membres de SystemParameters.

  • VirtualScreenWidth
  • VirtualScreenHeight

Celles-ci prennent même en compte les positions relatives des écrans.

Seulement testé avec deux moniteurs.

Cela vous donnera l’écran actuel en haut à gauche de la fenêtre, appelez simplement this.CurrentScreen () pour obtenir des informations sur l’écran actuel.

 using System.Windows; using System.Windows.Forms; namespace Common.Helpers { public static class WindowHelpers { public static Screen CurrentScreen(this Window window) { return Screen.FromPoint(new System.Drawing.Point((int)window.Left,(int)window.Top)); } } } 

Si vous êtes familier avec l’utilisation de la classe System.Windows.Forms , vous pouvez simplement append une référence à la classe System.Windows.Forms à votre projet:

Explorateur de solutions -> Références -> Ajouter des références … -> (Assemblys: Framework) -> faites défiler et vérifiez l’assembly System.Windows.Forms -> OK .

Maintenant, vous pouvez append à l’ aide de System.Windows.Forms; déclaration et utiliser l’écran dans votre projet wpf comme auparavant.

Pourquoi ne pas simplement utiliser ça?

 var interopHelper = new WindowInteropHelper(System.Windows.Application.Current.MainWindow); var activeScreen = Screen.FromHandle(interopHelper.Handle); 
 double screenWidth = System.Windows.SystemParameters.PrimaryScreenWidth; double screenhight= System.Windows.SystemParameters.PrimaryScreenHeight; 

Ça marche avec

 this.Width = System.Windows.SystemParameters.VirtualScreenWidth; this.Height = System.Windows.SystemParameters.VirtualScreenHeight; 

Testé sur 2 moniteurs.