it-swarm.com.de

Wie kann ich die aktiven Bildschirmabmessungen erhalten?

Was ich suche, ist das Äquivalent von System.Windows.SystemParameters.WorkArea für den Monitor, auf dem sich das Fenster gerade befindet.

Klarstellung: Das fragliche Fenster ist WPF, nicht WinForm.

130
chilltemp

Screen.FromControl, Screen.FromPoint und Screen.FromRectangle soll dir dabei helfen. In WinForms wäre es zum Beispiel:

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

Ich kenne keinen entsprechenden Aufruf für WPF. Daher müssen Sie so etwas wie diese Erweiterungsmethode ausführen.

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

Sie können dies verwenden, um die Grenzen des Desktoparbeitsbereichs des primären Bildschirms abzurufen:

System.Windows.SystemParameters.WorkArea

Dies ist auch nützlich, um nur die Größe des primären Bildschirms zu ermitteln:

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

61
Pyttroll

Außerdem benötigen Sie möglicherweise:

um die Gesamtgröße aller Monitore und nicht nur eines bestimmten zu erhalten.

33
742

Hinzufügen einer Lösung, die stattdessen nicht WinForms, sondern NativeMethods verwendet. Zuerst müssen Sie die benötigten nativen Methoden definieren.

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;
    }
}

Und dann erhalten Sie den Monitor-Handle und die Monitor-Informationen wie folgt.

        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

Add on zu ffpf

Screen.FromControl(this).Bounds
12
faulty

Achten Sie auf den Skalierungsfaktor Ihrer Fenster (100%/125%/150%/200%). Mit dem folgenden Code können Sie die tatsächliche Bildschirmgröße ermitteln:

SystemParameters.FullPrimaryScreenHeight
SystemParameters.FullPrimaryScreenWidth
11
aDoubleSo

Ich wollte die Bildschirmauflösung haben, bevor ich das erste meiner Fenster öffne, daher hier eine schnelle Lösung, um ein unsichtbares Fenster zu öffnen, bevor die Bildschirmabmessungen tatsächlich gemessen werden (Sie müssen die Fensterparameter an Ihr Fenster anpassen, um sicherzustellen, dass beide geöffnet sind) der selbe Bildschirm - hauptsächlich das WindowStartupLocation ist wichtig)

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

Ich musste die maximale Größe meiner Fensteranwendung festlegen. Dies kann sich ändern, wenn die Anwendung auf dem primären oder sekundären Bildschirm angezeigt wird. Um dieses Problem zu lösen, haben wir eine einfache Methode entwickelt, die ich Ihnen als nächstes zeige:

/// <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

Dies ist ein "Center Screen DotNet 4.5-Lösung ", der SystemParameters anstelle von System.Windows.Forms oder My.Compuer) verwendet. Bildschirm : Seit Windows 8 hat sich geändert der Berechnung der Bildschirmgröße sieht die einzige Möglichkeit für mich so aus (Taskleistenberechnung enthalten):

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

in C # Winforms habe ich den Startpunkt (für den Fall, dass wir mehrere Monitore/Anzeigen haben und ein Formular ein anderes aufruft) mithilfe der folgenden Methode:

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