2010-03-17 7 views

Répondre

-1

Vous pouvez utiliser la méthode Screen.FromControl pour obtenir l'écran actuel de la forme actuelle comme ceci:

Screen screen = Screen.FromControl(this); 

Ensuite, vous pouvez vérifier Screen.Primary pour voir si l'écran actuel est l'écran principal.

+21

Un 'Window' WPF n'est pas un Forms' Control', donc vous NE pouvez PAS utiliser 'Screen.FromControl (this)' dans ce cas. – cprcrack

+13

Cependant, vous pouvez utiliser: Screen.FromHandle (new WindowInteropHelper (this) .Handle); –

8

D'autres réponses disponibles jusqu'à présent n'abordent pas la partie WPF de la question. Voici ma prise. WPF ne semble pas exposer les informations d'écran détaillées telles qu'elles se trouvent dans la classe Screen de Windows Forms mentionnée dans d'autres réponses.

Cependant, vous pouvez utiliser la WinForms classe d'écran 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 noté que cette code pourrait avoir les coordonnées de droite et de bas d'un pixel dans certains cas de conversions double à int. Mais puisque vous êtes nitpicker, vous serez plus heureux de fixer mon code ;-)

+1

ne fonctionne pas si la fenêtre est agrandie –

+0

Il ne fonctionne pas non plus avec DPI par défaut. Surtout, différent DPI par moniteur. – LOST

0
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

Notez que 'myWindow.RestoreBounds' ne retourne pas la taille réelle et la position de la fenêtre si la fenêtre est ancrée à gauche ou à droite sur un écran. (Bouton Windows + flèche gauche ou droite) Dans ce cas, vous devez utiliser myWindow.Left, myWindow.Right, myWindow.Width et myWindow.Height. –

23

Si la fenêtre est agrandie, vous ne pouvez pas du tout compter sur window.Left ou window.Top car ils peuvent être les coordonnées avant qu'il ne soit maximisé. Mais vous pouvez le faire dans tous les cas:

var screen = System.Windows.Forms.Screen.FromHandle(
     new System.Windows.Interop.WindowInteropHelper(window).Handle); 
+5

Je vois l'écran où il a été ouvert, pas celui en cours. – Coneone

2

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, vous consultez dans lequel surveiller votre fenêtre est et qui est la principale. Comme ceci:

 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; 
Questions connexes