2008-10-31 10 views
109

To, czego szukam, to odpowiednik monitora System.Windows.SystemParameters.WorkArea dla monitora, na którym obecnie działa okno.Jak mogę uzyskać aktywne wymiary ekranu?

Wyjaśnienie: Okno, o którym mowa, to WPF, a nie WinForm.

+1

Zmieniono akceptowanej odpowiedzi odzwierciedlają najlepszy sposób zrobienia tego z WPF. System.Windows.SystemParameters. * – chilltemp

+0

Obsesja, że ​​nie używam przestrzeni nazw WinForm, wydaje mi się dziwna, nic nie zyskuje; zamiast tego pozostawia cię bez narzędzi potrzebnych do poprawnego rozwiązania problemu. –

+4

Dla mnie nie chodzi o WinForms vs. WPF. Chodzi o uczenie się czegoś nowego. Nie mogę zdecydować, która droga jest lepsza, jeśli nie nauczę się obu sposobów. – chilltemp

Odpowiedz

110

Screen.FromControl, Screen.FromPoint i Screen.FromRectangle powinien ci w tym pomóc. Na przykład w WinForms będzie to:

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

Nie znam równoważnego połączenia z WPF. Dlatego musisz zrobić coś takiego, jak ta metoda rozszerzenia.

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

Być może moje tagowanie nie wyjaśnia, że ​​używam okien WPF, a nie WinForm. Nie mam odniesienia do System.Windows.Forms.dll, a to i tak by nie działało, ponieważ WPF ma własne drzewo dziedziczenia. – chilltemp

+2

Screen.FromHandle ... zrobił dokładnie to, czego potrzebowałem. Dzięki – chilltemp

+1

Nie ma za co. Przepraszam, że nie znalazłem odpowiedzi - musiałem zbadać, co było dostępne w WPF, zanim zaktualizowałem swój post. –

10

Dodaj do ffpf

Screen.FromControl(this).Bounds 
+0

Dzięki, dodałem to do mojego przykładu. –

58

Można to wykorzystać, aby uzyskać granice obszaru roboczego pulpitu głównego ekranu:

System.Windows.SystemParameters.WorkArea

ta jest również przydatna dla uzyskania tylko rozmiar głównego ekranu:

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

+13

Jestem zdezorientowany ... Wygląda na to, że zwracamy tylko podstawowe wymiary ekranu. Chcę poznać wymiary ekranu, na którym obecnie znajduje się okno ... – VitalyB

+6

Jestem zdezorientowany, jak to odpowiada na zadane pytanie. –

+1

to nie odpowiada na pytanie, a nawet jeśli chcesz uzyskać rozmiar ekranu podstawowego, parametry SystemParameters (w WPF) są niepoprawne. zwracają urządzenia niezależne od urządzenia i * nie * piksele. dla lepszej implementacji zobacz tę odpowiedź: http://stackoverflow.com/questions/254197/how-can-i-get-the-active-screen-dimensions/254241#254241 –

3

Chciałam mieć rozdzielczość ekranu przed otwarciem pierwszego z moich okien, a więc tutaj szybkie rozwiązanie do otwierania niewidocznego okna przed rzeczywistym pomiarem wymiarów ekranu (musisz dostosować parametry okna do okna, aby zapewnić, że oba są otwierane na tym samym ekranie - głównie WindowStartupLocation jest ważna)

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

musiałem ustawić maksymalny rozmiar mojego wniosku okiennej. Ten można zmienić odpowiednio aplikacja jest pokazana na ekranie głównym lub wtórnym. Aby przezwyciężyć ten problem, e stworzył prostą metodę, że pokażę ci dalej:

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

Co zrobić, jeśli główny monitor znajduje się na dobrze? –

1

Jest to „centrum ekranu DotNet 4.5 solution”, używając SystemParameters zamiast System.Windows.Forms lub My.Compuer.Screen: Od Windows 8 has changed obliczenia wymiarów ekranu, jedynym sposobem to działa na mnie wygląda to tak (Taskbar Wyliczenie zawarte):

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

Uważaj na sc współczynnik ale waszych okien (100%/125%/150%/200%). Można uzyskać prawdziwy rozmiar ekranu za pomocą następującego kodu:

SystemParameters.FullPrimaryScreenHeight 
SystemParameters.FullPrimaryScreenWidth 
9

Dodanie rozwiązania, które nie zamiast korzystania WinForms ale NativeMethods. Najpierw musisz zdefiniować potrzebne metody natywne.

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

A następnie pobierz uchwyt monitora i informacje monitora w ten sposób.

 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

w C# WinForm Mam punkcie startowym (dla przypadku, gdy mamy kilka monitora/diplay i jedna forma dzwoni inny) z pomocą następującej metody:

private Point get_start_point() 
    { 
     return 
      new Point(Screen.GetBounds(parent_class_with_form.ActiveForm).X, 
         Screen.GetBounds(parent_class_with_form.ActiveForm).Y 
        ); 
    } 
Powiązane problemy