77 votes

C# : Obtenir la taille complète du bureau ?

Comment puis-je connaître la taille de l'ensemble du bureau ? Non la "zone de travail" et pas la "résolution d'écran", qui se réfèrent toutes deux à un seul écran. Je souhaite connaître la largeur et la hauteur totales du bureau virtuel dont chaque moniteur n'affiche qu'une partie.

2 votes

Peut-être que la "taille complète du bureau" dépendra de la façon dont les écrans sont positionnés. Je ne sais pas trop comment calculer cela, mais vous pouvez toujours récupérer le nombre d'écrans et la résolution de chaque écran avec System.Windows.Forms.Screen.AllScreens.

131voto

Dennis Points 9534

Deux possibilités s'offrent à vous :

  1. PresentationFramework.dll

    SystemParameters.VirtualScreenWidth   
    SystemParameters.VirtualScreenHeight
  2. System.Windows.Forms.dll

    SystemInformation.VirtualScreen.Width   
    SystemInformation.VirtualScreen.Height

Utiliser le première option si vous développez une application WPF.

1 votes

Plus de réponses comme celle-ci ! Courtes, correctes et esthétiques !

0 votes

J'ai trouvé des scénarios dans lesquels ces valeurs ne s'appliquent qu'à un seul écran si la mise à l'échelle est activée. Il se peut que cela dépende du matériel, je n'en suis pas encore sûr.

0 votes

C'est probable, étant donné qu'en 2011, la mise à l'échelle de plusieurs ordinateurs de bureau n'existait pas encore. @KellyElton mettez à jour la réponse si vous trouvez un correctif.

31voto

P Daddy Points 14228

Je pense qu'il est temps d'actualiser cette réponse avec un peu de LINQ, qui permet d'obtenir facilement la taille totale du bureau avec une seule expression.

Console.WriteLine(
    Screen.AllScreens.Select(screen=>screen.Bounds)
    .Aggregate(Rectangle.Union)
    .Size
);

Ma réponse initiale suit :


Je pense que ce que vous voulez, c'est quelque chose comme ça :

int minx, miny, maxx, maxy;
minx = miny = int.MaxValue;
maxx = maxy = int.MinValue;

foreach(Screen screen in Screen.AllScreens){
    var bounds = screen.Bounds;
    minx = Math.Min(minx, bounds.X);
    miny = Math.Min(miny, bounds.Y);
    maxx = Math.Max(maxx, bounds.Right);
    maxy = Math.Max(maxy, bounds.Bottom);
}

Console.WriteLine("(width, height) = ({0}, {1})", maxx - minx, maxy - miny);

Gardez à l'esprit que ces données ne sont pas exhaustives. Il est possible que plusieurs moniteurs soient décalés ou disposés de manière non rectangulaire. Il se peut donc que tout l'espace entre (minx, miny) et (maxx, maxy) ne soit pas visible.

EDIT :

Je viens de réaliser que le code pourrait être un peu plus simple en utilisant Rectangle.Union :

Rectangle rect = new Rectangle(int.MaxValue, int.MaxValue, int.MinValue, int.MinValue);

foreach(Screen screen in Screen.AllScreens)
    rect = Rectangle.Union(rect, screen.Bounds);

Console.WriteLine("(width, height) = ({0}, {1})", rect.Width, rect.Height);

3 votes

Je suis un programmeur ukrainien. Je vérifie que ce code fonctionne à partir de la boîte. Il suffit de le copier et de le coller.

15voto

chris LB Points 183

Vérifier :

SystemInformation.VirtualScreen.Width
SystemInformation.VirtualScreen.Height

7voto

Andreas Points 468

Pour obtenir la taille physique des pixels de l'écran, vous pouvez utiliser la méthode suivante.

static class DisplayTools
{
    [DllImport("gdi32.dll")]
    static extern int GetDeviceCaps(IntPtr hdc, int nIndex);

    private enum DeviceCap
    {
        Desktopvertres = 117,
        Desktophorzres = 118
    }

    public static Size GetPhysicalDisplaySize()
    {
        Graphics g = Graphics.FromHwnd(IntPtr.Zero);
        IntPtr desktop = g.GetHdc();

        int physicalScreenHeight = GetDeviceCaps(desktop, (int)DeviceCap.Desktopvertres);
        int physicalScreenWidth = GetDeviceCaps(desktop, (int)DeviceCap.Desktophorzres);

        return new Size(physicalScreenWidth, physicalScreenHeight);
    }

}

0 votes

Celui-ci est le premier à indiquer la taille correcte, mais seulement pour un seul moniteur.

6voto

TechStuffBC Points 76

Cela ne répond pas à la question, mais apporte simplement un éclairage supplémentaire sur le point (emplacement) d'une fenêtre dans l'ensemble des écrans.)

Utilisez le code ci-dessous pour déterminer si un point (par exemple, le dernier emplacement connu d'une fenêtre) se trouve dans les limites du bureau global. Si ce n'est pas le cas, réinitialiser l'emplacement de la fenêtre à la valeur par défaut. pBaseLoc ;

Le code ne tient pas compte de la barre des tâches ou d'autres barres d'outils.

Exemple d'utilisation : Enregistrer l'emplacement de la fenêtre dans une base de données à partir de station A . L'utilisateur se connecte à station B avec 2 moniteurs et déplace la fenêtre sur le 2ème moniteur, se déconnecte en sauvegardant le nouvel emplacement. Retour à la page station A et la fenêtre ne serait pas affichée si le code ci-dessus n'était pas utilisé.

La solution que j'ai trouvée consiste à enregistrer l'ID de l'utilisateur et l'IP de la station (et winLoc) dans la base de données ou dans le fichier local des préférences de l'utilisateur pour une application donnée, puis à charger les préférences de l'utilisateur pour cette station et cette application.

Point pBaseLoc = new Point(40, 40)
int x = -500, y = 140;
Point pLoc = new Point(x, y);
bool bIsInsideBounds = false;

foreach (Screen s in Screen.AllScreens)
{
    bIsInsideBounds = s.Bounds.Contains(pLoc);
    if (bIsInsideBounds) { break; }
}//foreach (Screen s in Screen.AllScreens)

if (!bIsInsideBounds) { pLoc = pBaseLoc;  }

this.Location = pLoc;

6 votes

Si vous savoir que cela ne répond pas à la question, pourquoi l'affichez-vous comme une réponse à la question ? La première phrase n'aurait-elle pas dû tirer la sonnette d'alarme ?

1 votes

D'autre part, c'est exactement ce que je cherchais lorsque j'ai fait des recherches sur ce sujet.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X