Dans une application C #, comment savoir si une fenêtre WPF se trouve sur le moniteur principal ou sur un autre moniteur?
Si la fenêtre est agrandie, vous ne pouvez pas compter sur window.Left ou window.Top du tout, car il peut s'agir des coordonnées avant l'agrandissement. Mais vous pouvez le faire dans tous les cas:
var screen = System.Windows.Forms.Screen.FromHandle(
new System.Windows.Interop.WindowInteropHelper(window).Handle);
Les autres réponses disponibles à ce jour n'abordent pas la partie WPF de la question. Voici ma prise.
WPF ne semble pas exposer des informations détaillées sur l’écran, contrairement à la classe Screen de Windows Forms mentionnée dans d’autres réponses.
Toutefois, vous pouvez utiliser la classe WinForms Screen dans votre programme WPF:
Ajoutez des références à System.Windows.Forms
et System.Drawing
var screen = System.Windows.Forms.Screen.FromRectangle(
new System.Drawing.Rectangle(
(int)myWindow.Left, (int)myWindow.Top,
(int)myWindow.Width, (int)myWindow.Height));
Notez que si vous êtes un nitpicker, vous avez peut-être remarqué que ce code pourrait avoir les coordonnées droite et inférieure décalées d'un pixel dans certains cas de conversions double à int. Mais puisque vous êtes un tatoueur, vous serez plus qu'heureux de corriger mon code ;-)
Pour ce faire, vous devez utiliser certaines méthodes natives.
https://msdn.Microsoft.com/en-us/library/windows/desktop/dd145064(v=vs.85).aspx
internal static class NativeMethods
{
public const Int32 MONITOR_DEFAULTTOPRIMARY = 0x00000001;
public const Int32 MONITOR_DEFAULTTONEAREST = 0x00000002;
[DllImport( "user32.dll" )]
public static extern IntPtr MonitorFromWindow( IntPtr handle, Int32 flags );
}
Ensuite, il vous suffit de vérifier le moniteur de votre fenêtre et celui qui est le principal. Comme ça:
var hwnd = new WindowInteropHelper( this ).EnsureHandle();
var currentMonitor = NativeMethods.MonitorFromWindow( hwnd, NativeMethods.MONITOR_DEFAULTTONEAREST );
var primaryMonitor = NativeMethods.MonitorFromWindow( IntPtr.Zero, NativeMethods.MONITOR_DEFAULTTOPRIMARY );
var isInPrimary = currentMonitor == primaryMonitor;
public static bool IsOnPrimary(Window myWindow)
{
var rect = myWindow.RestoreBounds;
Rectangle myWindowBounds= new Rectangle((int)rect.X, (int)rect.Y, (int)rect.Width, (int)rect.Height);
return myWindowBounds.IntersectsWith(WinForms.Screen.PrimaryScreen.Bounds);
/* Where
using System.Drawing;
using System.Windows;
using WinForms = System.Windows.Forms;
*/
}
Check out Comment trouver l'écran en C # sur lequel l'application est exécutée
Aussi Exécuter l’application sur un environnement à double écran a une solution intéressante:
bool onPrimary = this.Bounds.IntersectsWith(Screen.PrimaryScreen.Bounds);
où "ceci" est la forme principale de votre application.