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
.
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
.
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);
}
}
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
Screen.FromHandle ... zrobił dokładnie to, czego potrzebowałem. Dzięki – chilltemp
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. –
Dodaj do ffpf
Screen.FromControl(this).Bounds
Dzięki, dodałem to do mojego przykładu. –
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
Jestem zdezorientowany ... Wygląda na to, że zwracamy tylko podstawowe wymiary ekranu. Chcę poznać wymiary ekranu, na którym obecnie znajduje się okno ... – VitalyB
Jestem zdezorientowany, jak to odpowiada na zadane pytanie. –
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 –
Również może trzeba:
uzyskać łączny rozmiar wszystkich monitorów, a nie jeden w szczególności.
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();
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;
}
}
}
Co zrobić, jeśli główny monitor znajduje się na dobrze? –
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
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
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);
}
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
);
}
Zmieniono akceptowanej odpowiedzi odzwierciedlają najlepszy sposób zrobienia tego z WPF. System.Windows.SystemParameters. * – chilltemp
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. –
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