Dans une application C#, comment puis-je savoir si une fenêtre WPF se trouve dans le moniteur principal ou un autre moniteur?Comment savoir dans quel moniteur une fenêtre WPF se trouve
Répondre
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.
Un 'Window' WPF n'est pas un Forms' Control', donc vous NE pouvez PAS utiliser 'Screen.FromControl (this)' dans ce cas. – cprcrack
Cependant, vous pouvez utiliser: Screen.FromHandle (new WindowInteropHelper (this) .Handle); –
Découvrez How do I find what screen the application is running on in C#
également Run Application on a Dual Screen Environment a une solution intéressante:
bool onPrimary = this.Bounds.IntersectsWith(Screen.PrimaryScreen.Bounds);
où "ce" est la principale forme de votre application.
Ne fonctionne pas par défaut DPI et DPI par moniteur. – LOST
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 ;-)
ne fonctionne pas si la fenêtre est agrandie –
Il ne fonctionne pas non plus avec DPI par défaut. Surtout, différent DPI par moniteur. – LOST
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;
*/
}
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. –
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);
Je vois l'écran où il a été ouvert, pas celui en cours. – Coneone
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;
- 1. Détecter quel moniteur affiche la fenêtre
- 2. Comment puis-je savoir si la souris se trouve sur une fenêtre de niveau supérieur?
- 3. Fenêtre Moniteur (capture d'écran)
- 4. Dans quel espace de noms se trouve la DelegateCommand?
- 5. Comment un QToolBar peut-il savoir où il se trouve?
- 6. Déterminez quel segment l'image se trouve dans l'objectif c
- 7. Comment savoir si une instance nommée se trouve dans le conteneur dans StructureMap 2.6?
- 8. Comment savoir si mon composant Java se trouve dans une applet?
- 9. Avoir une fenêtre wpf dans une autre fenêtre wpf
- 10. Lancer une fenêtre WPF
- 11. Comment créer une fenêtre WPF dans BackgroundWorker?
- 12. Comment actualiser manuellement une fenêtre dans WPF?
- 13. Attribuer une valeur de DatePicker dans une fenêtre à DatePicker deuxième dans une autre fenêtre WPF
- 14. Quel algorithme de tri se trouve derrière un NSSortDescriptor?
- 15. Comment déterminer le moniteur dans lequel se produit un événement de souris Swing?
- 16. Référez-vous à une DLL qui se trouve dans un autre DLL dans WPF
- 17. Où se trouve la fenêtre Debug -> Exceptions?
- 18. Dans WPF, comment puis-je déterminer quelle colonne/ligne dans une grille se trouve dans un contrôle?
- 19. Comment savoir quel thread appelé une méthode
- 20. WPF Comment obtenir une référence de fenêtre chargée à partir d'une page qui s'y trouve?
- 21. positionnement d'un dialogue jquery qui se trouve dans une iframe realtive à la fenêtre parente
- 22. Comment savoir quel fichier initialise l'objet?
- 23. Comment envoyer une fenêtre WPF à l'arrière?
- 24. À quel emplacement de fichier phpMyAdmin se trouve-t-il?
- 25. Définir le moniteur DPI dans WPF
- 26. Comment savoir quel formulaire est en haut?
- 27. WPF: Restyling une fenêtre?
- 28. Comment savoir quel bouton radio est sélectionné dans une vue?
- 29. Comment savoir si une fenêtre est active? (Win32 API)
- 30. Où se trouve mon AlertDialog?
Les chances sont bonnes que ce soit sur les deux. –
@Helen cette question s'applique à Winforms, c'est pour WPF qui est différent. –