Dans une application C #, comment puis-je 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 sa maximisation. 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 ne traitent pas la partie WPF de la question. Voici ma prise
WPF ne semble pas exposer les informations d’écran détaillées dans la classe d’écran de Windows Forms mentionnée dans d’autres réponses.
Cependant, vous pouvez utiliser la classe WinForms Screen dans votre programme WPF:
Ajouter 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 des coordonnées droites et inférieures de un pixel dans certains cas de conversions double à int. Mais comme vous êtes un nitpicker, vous serez plus qu’heureux de corriger mon code 😉
Pour ce faire, vous devez utiliser des 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 quel moniteur est votre fenêtre et quel 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;
Check out Comment trouver l’écran sur lequel l’application s’exécute en C #
Également exécuter l’application sur un environnement à double écran a une solution intéressante:
bool onPrimary = this.Bounds.IntersectsWith(Screen.PrimaryScreen.Bounds);
où “this” est la forme principale de votre application.
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; */ }
Vous pouvez utiliser la méthode Screen.FromControl
pour obtenir l’écran actuel du formulaire en cours, comme ceci:
Screen screen = Screen.FromControl(this);
Ensuite, vous pouvez vérifier Screen.Primary
pour voir si l’écran actuel est l’écran principal.