web-dev-qa-db-fra.com

Comment puis-je obtenir les dimensions de l'écran actif?

Ce que je cherche, c'est l'équivalent de System.Windows.SystemParameters.WorkArea pour le moniteur sur lequel se trouve la fenêtre.

Clarification: La fenêtre en question est WPF, pas WinForm.

130
chilltemp

Screen.FromControl, Screen.FromPoint et Screen.FromRectangle devrait vous aider avec ceci. Par exemple dans WinForms, ce serait:

class MyForm : Form
{
  public Rectangle GetScreen()
  {
    return Screen.FromControl(this).Bounds;
  }
}

Je ne connais pas d'appel équivalent pour WPF. Par conséquent, vous devez faire quelque chose comme cette méthode d'extension.

static class ExtensionsForWPF
{
  public static System.Windows.Forms.Screen GetScreen(this Window window)
  {
    return System.Windows.Forms.Screen.FromHandle(new WindowInteropHelper(window).Handle);
  }
}
135
Jeff Yates

Vous pouvez utiliser ceci pour obtenir les limites de l’espace de travail du bureau de l’écran principal:

System.Windows.SystemParameters.WorkArea

Ceci est également utile pour obtenir uniquement la taille de l'écran principal:

System.Windows.SystemParameters.PrimaryScreenWidthSystem.Windows.SystemParameters.PrimaryScreenHeight

61
Pyttroll

Aussi, vous aurez peut-être besoin de:

pour obtenir la taille combinée de tous les moniteurs et non d'un en particulier.

33
742

Ajout d'une solution qui n'utilise pas WinForms mais NativeMethods à la place. Vous devez d’abord définir les méthodes natives nécessaires.

public static class NativeMethods
{
    public const Int32 MONITOR_DEFAULTTOPRIMERTY = 0x00000001;
    public const Int32 MONITOR_DEFAULTTONEAREST = 0x00000002;


    [DllImport( "user32.dll" )]
    public static extern IntPtr MonitorFromWindow( IntPtr handle, Int32 flags );


    [DllImport( "user32.dll" )]
    public static extern Boolean GetMonitorInfo( IntPtr hMonitor, NativeMonitorInfo lpmi );


    [Serializable, StructLayout( LayoutKind.Sequential )]
    public struct NativeRectangle
    {
        public Int32 Left;
        public Int32 Top;
        public Int32 Right;
        public Int32 Bottom;


        public NativeRectangle( Int32 left, Int32 top, Int32 right, Int32 bottom )
        {
            this.Left = left;
            this.Top = top;
            this.Right = right;
            this.Bottom = bottom;
        }
    }


    [StructLayout( LayoutKind.Sequential, CharSet = CharSet.Auto )]
    public sealed class NativeMonitorInfo
    {
        public Int32 Size = Marshal.SizeOf( typeof( NativeMonitorInfo ) );
        public NativeRectangle Monitor;
        public NativeRectangle Work;
        public Int32 Flags;
    }
}

Et puis obtenir la poignée du moniteur et les informations du moniteur comme ceci.

        var hwnd = new WindowInteropHelper( this ).EnsureHandle();
        var monitor = NativeMethods.MonitorFromWindow( hwnd, NativeMethods.MONITOR_DEFAULTTONEAREST );

        if ( monitor != IntPtr.Zero )
        {
            var monitorInfo = new NativeMonitorInfo();
            NativeMethods.GetMonitorInfo( monitor, monitorInfo );

            var left = monitorInfo.Monitor.Left;
            var top = monitorInfo.Monitor.Top;
            var width = ( monitorInfo.Monitor.Right - monitorInfo.Monitor.Left );
            var height = ( monitorInfo.Monitor.Bottom - monitorInfo.Monitor.Top );
        }
16
R.Rusev

Ajouter à ffpf

Screen.FromControl(this).Bounds
12
faulty

Méfiez-vous du facteur d'échelle de vos fenêtres (100%/125%/150%/200%). Vous pouvez obtenir la taille réelle de l'écran en utilisant le code suivant:

SystemParameters.FullPrimaryScreenHeight
SystemParameters.FullPrimaryScreenWidth
11
aDoubleSo

Je voulais avoir la résolution de l'écran avant d'ouvrir la première de mes fenêtres. Voici donc une solution rapide pour ouvrir une fenêtre invisible avant de mesurer les dimensions de l'écran (vous devez adapter les paramètres de la fenêtre à votre fenêtre pour vous assurer que les deux sont ouverts. le même écran - principalement le WindowStartupLocation est important)

Window w = new Window();
w.ResizeMode = ResizeMode.NoResize;
w.WindowState = WindowState.Normal;
w.WindowStyle = WindowStyle.None;
w.Background = Brushes.Transparent;
w.Width = 0;
w.Height = 0;
w.AllowsTransparency = true;
w.IsHitTestVisible = false;
w.WindowStartupLocation = WindowStartupLocation.Manual;
w.Show();
Screen scr = Screen.FromHandle(new WindowInteropHelper(w).Handle);
w.Close();
4
Andre

Je devais définir la taille maximale de mon application Windows. Celui-ci pourrait être modifié en conséquence, l'application est affichée dans l'écran principal ou dans l'écran secondaire. Pour surmonter ce problème, nous avons créé une méthode simple que je vous montrerai ensuite:

/// <summary>
/// Set the max size of the application window taking into account the current monitor
/// </summary>
public static void SetMaxSizeWindow(ioConnect _receiver)
{
    Point absoluteScreenPos = _receiver.PointToScreen(Mouse.GetPosition(_receiver));

    if (System.Windows.SystemParameters.VirtualScreenLeft == System.Windows.SystemParameters.WorkArea.Left)
    {
        //Primary Monitor is on the Left
        if (absoluteScreenPos.X <= System.Windows.SystemParameters.PrimaryScreenWidth)
        {
            //Primary monitor
            _receiver.WindowApplication.MaxWidth = System.Windows.SystemParameters.WorkArea.Width;
            _receiver.WindowApplication.MaxHeight = System.Windows.SystemParameters.WorkArea.Height;
        }
        else
        {
            //Secondary monitor
            _receiver.WindowApplication.MaxWidth = System.Windows.SystemParameters.VirtualScreenWidth - System.Windows.SystemParameters.WorkArea.Width;
            _receiver.WindowApplication.MaxHeight = System.Windows.SystemParameters.VirtualScreenHeight;
        }
    }

    if (System.Windows.SystemParameters.VirtualScreenLeft < 0)
    {
        //Primary Monitor is on the Right
        if (absoluteScreenPos.X > 0)
        {
            //Primary monitor
            _receiver.WindowApplication.MaxWidth = System.Windows.SystemParameters.WorkArea.Width;
            _receiver.WindowApplication.MaxHeight = System.Windows.SystemParameters.WorkArea.Height;
        }
        else
        {
            //Secondary monitor
            _receiver.WindowApplication.MaxWidth = System.Windows.SystemParameters.VirtualScreenWidth - System.Windows.SystemParameters.WorkArea.Width;
            _receiver.WindowApplication.MaxHeight = System.Windows.SystemParameters.VirtualScreenHeight;
        }
    }
}
3
Ricardo Magalhães

Il s’agit d’un "Écran central solution DotNet 4.5 ", utilisant SystemParameters au lieu de System.Windows.Forms ou My.Compuer. Screen : Depuis Windows 8 a changé le calcul de la dimension de l'écran, la seule façon dont cela fonctionne pour moi est la suivante (calcul de la barre des tâches inclus):

Private Sub Window_Loaded(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded
    Dim BarWidth As Double = SystemParameters.VirtualScreenWidth - SystemParameters.WorkArea.Width
    Dim BarHeight As Double = SystemParameters.VirtualScreenHeight - SystemParameters.WorkArea.Height
    Me.Left = (SystemParameters.VirtualScreenWidth - Me.ActualWidth - BarWidth) / 2
    Me.Top = (SystemParameters.VirtualScreenHeight - Me.ActualHeight - BarHeight) / 2         
End Sub

Center Screen WPF XAML

3
Nasenbaer

en C # winforms j'ai point de départ (dans le cas où nous avons plusieurs monitor/diplay et qu'un formulaire en appelle un autre) avec l'aide de la méthode suivante:

private Point get_start_point()
    {
        return
            new Point(Screen.GetBounds(parent_class_with_form.ActiveForm).X,
                      Screen.GetBounds(parent_class_with_form.ActiveForm).Y
                      );
    }
2
Oleg Bash