web-dev-qa-db-fra.com

Comment savoir dans quelle fenêtre se trouve une fenêtre WPF

Dans une application C #, comment savoir si une fenêtre WPF se trouve sur le moniteur principal ou sur un autre moniteur?

40
tom greene

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);
26
Mike Blandford

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

8
Serge Wautier

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;
3
R.Rusev
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;
     */
}
0
Fiacc

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.

0
SwDevMan81