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
.
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);
}
}
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.PrimaryScreenWidth
System.Windows.SystemParameters.PrimaryScreenHeight
Aussi, vous aurez peut-être besoin de:
pour obtenir la taille combinée de tous les moniteurs et non d'un en particulier.
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 );
}
Ajouter à ffpf
Screen.FromControl(this).Bounds
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
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();
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;
}
}
}
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
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
);
}