2008-10-31 15 views
109

Lo que estoy buscando es el equivalente a System.Windows.SystemParameters.WorkArea para el monitor en el que se encuentra actualmente la ventana.¿Cómo puedo obtener las dimensiones de la pantalla activa?

aclaración: La ventana en cuestión es WPF, no WinForm.

+1

cambiado respuesta aceptada a refleje la mejor manera de hacerlo desde WPF. System.Windows.SystemParameters. * – chilltemp

+0

La obsesión por no usar un espacio de nombres de WinForms me parece extraña, no gana nada; en cambio, te deja sin las herramientas que necesitas para resolver adecuadamente el problema. –

+4

Para mí, no se trata de WinForms vs. WPF. Se trata de aprender algo nuevo. No puedo decidir qué camino es mejor si no aprendo en ambos sentidos. – chilltemp

Respuesta

110

Screen.FromControl, Screen.FromPoint y Screen.FromRectangle debería ayudarlo con esto. Por ejemplo, en WinForms sería:

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

No conozco una llamada equivalente para WPF. Por lo tanto, debe hacer algo como este método de extensión.

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

Quizás mi etiquetado no dejó en claro que estoy usando Windows WPF, no WinForms. No tengo el System.Windows.Forms.dll al que se hace referencia, y no funcionaría de todos modos ya que WPF tiene su propio árbol de herencia. – chilltemp

+2

Screen.FromHandle ... hizo exactamente lo que necesitaba. Gracias – chilltemp

+1

De nada. Mis disculpas por no haber llegado directamente a la respuesta: tuve que investigar qué estaba disponible en WPF antes de actualizar mi publicación. –

10

Añadir a FFPF

Screen.FromControl(this).Bounds 
+0

Gracias, agregué esto en mi ejemplo. –

58

Usted puede usar esto para obtener los límites del espacio de trabajo de escritorio de la pantalla principal:

System.Windows.SystemParameters.WorkArea

Esto también es útil para obtener el tamaño de la pantalla principal:

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

+13

Estoy confundido ... Esto parece devolver las dimensiones de la pantalla principal. Quiero saber las dimensiones de la pantalla que actualmente tiene la ventana en ... – VitalyB

+6

No estoy seguro de cómo responde esto a la pregunta. –

+1

esto no responde la pregunta e incluso si solo desea obtener el tamaño de la pantalla principal, los parámetros del sistema (en WPF) son incorrectos. devuelven unidades independientes del dispositivo y * no * píxeles. para una mejor implementación, vea esta respuesta: http://stackoverflow.com/questions/254197/how-can-i-get-the-active-screen-dimensions/254241#254241 –

3

Quería tener la resolución de pantalla antes de abrir la primera de mis ventanas, aquí una solución rápida para abrir una ventana invisible antes de medir las dimensiones de la pantalla (debe adaptar los parámetros de la ventana a su ventana para asegurarse ambos están ampliable en la misma pantalla - sobre todo la WindowStartupLocation es importante)

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(); 
2

que necesitaba para establecer el tamaño máximo de la ventana de mi solicitud. Este podría cambiar en consecuencia, la aplicación se muestra en la pantalla principal o en la secundaria. Para superar este problema e creado un método sencillo que les muestro a continuación:

/// <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; 
     } 
    } 
} 
+1

¿Qué sucede si su monitor principal está en el ¿derecho? –

1

Esta es una "pantalla Centro DotNet 4.5 solution", usando SystemParameters en lugar de System.Windows.Forms o My.Compuer.Screen: Desde Windows 8 has changed el cálculo dimensiones de pantalla, la única manera de funciona para mí puede ser como la (cálculo de la barra de tareas incluido):

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

8

se guarda del SC factor de ale de sus ventanas (100%/125%/150%/200%). Usted puede obtener el tamaño real de la pantalla utilizando el siguiente código:

SystemParameters.FullPrimaryScreenHeight 
SystemParameters.FullPrimaryScreenWidth 
9

Adición de una solución que no utiliza Windows Forms pero NativeMethods lugar. Primero debe definir los métodos nativos necesarios.

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

Y luego obtenga la manija del monitor y la información del monitor de esta manera.

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

en C# WinForms tengo punto de partida (para el caso cuando tenemos varios de monitor/diplay y una forma está llamando a otro) con la ayuda del siguiente método:

private Point get_start_point() 
    { 
     return 
      new Point(Screen.GetBounds(parent_class_with_form.ActiveForm).X, 
         Screen.GetBounds(parent_class_with_form.ActiveForm).Y 
        ); 
    } 
Cuestiones relacionadas