Réponse acceptée modifiée pour refléter la meilleure façon de le faire à partir de WPF. System.Windows.SystemParameters. *
chilltemp
1
L'obsession de ne pas utiliser d'espace de noms WinForms me semble étrange, cela ne vous rapporte rien; au lieu de cela, il vous laisse sans les outils dont vous avez besoin pour résoudre correctement le problème.
Jeff Yates
4
Pour moi, il ne s'agit pas de WinForms contre WPF. Il s'agit d'apprendre quelque chose de nouveau. Je ne peux pas décider quelle est la meilleure manière si je n'apprends pas les deux.
chilltemp
3
Eh bien, dans ce scénario, il n'y a pas "dans les deux sens" car il n'y a qu'une seule façon de faire cela, qui est d'utiliser les trucs WinForms.
Jeff Yates
@Jeff Yates: Vous avez raison. J'ai déterré le projet original pour lequel j'avais posé cette question et j'ai découvert que j'avais utilisé les propriétés PrimaryScreen *. Ils ont résolu mes besoins du jour, mais pas la question que j'ai posée. Désolé pour le run-around; J'ai changé la réponse acceptée en conséquence.
chilltemp
Réponses:
143
Screen.FromControl, Screen.FromPointet Screen.FromRectangledevrait vous aider. Par exemple dans WinForms, ce serait:
Peut-être que mon balisage n'indiquait pas clairement que j'utilisais des fenêtres WPF, pas WinForms. Je n'ai pas le System.Windows.Forms.dll référencé, et cela ne fonctionnerait pas de toute façon car WPF a son propre arbre d'héritage.
chilltemp
1
De rien. Je m'excuse de ne pas aller directement à la réponse - j'ai dû enquêter sur ce qui était disponible dans WPF avant de mettre à jour mon message.
Jeff Yates
Cela fonctionne pour mettre une fenêtre sur le bord droit: var bounds = this.GetScreen (). WorkingArea; this.Left = bounds.Right - this.Width; Mais il nécessite des références à System.Windows.Forms et System.Drawing, ce qui n'est pas idéal.
Anthony
1
@devios Attention, cet appel n'est pas compatible DPI; vous devrez faire des calculs.
Lynn Crumbling
6
Dans mon application VS 2015 WPF ciblant .NET 4.5 sur mon système à 4 moniteurs sur Windows 10 Pro (v10.0.14393) avec windowsur le moniteur au - dessus de mon principal (par exemple, son Top < 0), a FromHandlerenvoyé le Screenpour mon moniteur principal (même s'il windowétait complètement à l' intérieur le moniteur secondaire)!?! Soupir. Il semble que je devrais rechercher Screen.AllScreensmoi-même le tableau. Pourquoi les choses ne peuvent-elles pas "simplement fonctionner"?!? Arrrrgh.
Tom
62
Vous pouvez l'utiliser pour obtenir les limites de l'espace de travail du bureau de l'écran principal:
Je suis confus ... Cela ne semble renvoyer que les dimensions principales de l'écran. Je veux connaître les dimensions de l'écran où se trouve actuellement la fenêtre ...
VitalyB
1
cela ne répond pas à la question et même si vous souhaitez simplement obtenir la taille de l'affichage principal, les SystemParameters (dans WPF) sont incorrects. ils renvoient des unités indépendantes de l'appareil et non des pixels. pour une meilleure implémentation, voir cette réponse: stackoverflow.com/questions/254197/…
Patrick Klug
1
PrimaryScreenHeight / Width a fonctionné exactement comme prévu et MSDN a les éléments suivants sur eux: «Obtient une valeur qui indique la hauteur de l'écran, en pixels, du moniteur d'affichage principal. WorkArea ne dit pas spécifiquement les pixels, mais la documentation et les exemples d'utilisation me portent à croire que c'est aussi en pixels. Avez-vous un lien vers quelque chose indiquant l'utilisation d'unités indépendantes de l'appareil?
Attention au facteur d'échelle de vos fenêtres (100% / 125% / 150% / 200%). Vous pouvez obtenir la taille réelle de l'écran en utilisant le code suivant:
C'est pour l'écran principal - que se passe-t-il si la fenêtre de votre application est sur un écran virtuel (étendu) (c'est-à-dire que vous avez un ou deux moniteurs externes connectés à votre PC)?
Matt
4
Je voulais avoir la résolution de l'écran avant d'ouvrir la première de mes fenêtres, alors voici une solution rapide pour ouvrir une fenêtre invisible avant de mesurer réellement les dimensions de l'écran (vous devez adapter les paramètres de la fenêtre à votre fenêtre afin de vous assurer que les deux s'ouvrent le même écran - principalement le WindowStartupLocationest important)
PrivateSubWindow_Loaded(ByVal sender AsSystem.Object,ByVal e AsSystem.Windows.RoutedEventArgs)HandlesMyBase.LoadedDimBarWidthAsDouble=SystemParameters.VirtualScreenWidth-SystemParameters.WorkArea.WidthDimBarHeightAsDouble=SystemParameters.VirtualScreenHeight-SystemParameters.WorkArea.HeightMe.Left=(SystemParameters.VirtualScreenWidth-Me.ActualWidth-BarWidth)/2Me.Top=(SystemParameters.VirtualScreenHeight-Me.ActualHeight-BarHeight)/2EndSub
configuration du programme d'installation dans WPF?
Kiquenet
La question principale concerne la position de l'écran. Comme l'installateur Msi, Innosetup ou autres, j'ai créé mon propre installateur avec vérification du processeur, vérification des autorisations, vérification des pilotes et bien plus encore, très simple à utiliser. C'est la capture d'écran à propos.
Nasenbaer
3
J'avais besoin de définir la taille maximale de mon application de fenêtre. Celui-ci pourrait être modifié en fonction de l'affichage de l'application dans l'écran principal ou dans le secondaire. Pour surmonter ce problème, nous avons créé une méthode simple que je vous montre ensuite:
/// <summary>/// Set the max size of the application window taking into account the current monitor/// </summary>publicstaticvoidSetMaxSizeWindow(ioConnect _receiver){Point absoluteScreenPos = _receiver.PointToScreen(Mouse.GetPosition(_receiver));if(System.Windows.SystemParameters.VirtualScreenLeft==System.Windows.SystemParameters.WorkArea.Left){//Primary Monitor is on the Leftif(absoluteScreenPos.X <=System.Windows.SystemParameters.PrimaryScreenWidth){//Primary monitor
_receiver.WindowApplication.MaxWidth=System.Windows.SystemParameters.WorkArea.Width;
_receiver.WindowApplication.MaxHeight=System.Windows.SystemParameters.WorkArea.Height;}else{//Secondary monitor
_receiver.WindowApplication.MaxWidth=System.Windows.SystemParameters.VirtualScreenWidth-System.Windows.SystemParameters.WorkArea.Width;
_receiver.WindowApplication.MaxHeight=System.Windows.SystemParameters.VirtualScreenHeight;}}if(System.Windows.SystemParameters.VirtualScreenLeft<0){//Primary Monitor is on the Rightif(absoluteScreenPos.X >0){//Primary monitor
_receiver.WindowApplication.MaxWidth=System.Windows.SystemParameters.WorkArea.Width;
_receiver.WindowApplication.MaxHeight=System.Windows.SystemParameters.WorkArea.Height;}else{//Secondary monitor
_receiver.WindowApplication.MaxWidth=System.Windows.SystemParameters.VirtualScreenWidth-System.Windows.SystemParameters.WorkArea.Width;
_receiver.WindowApplication.MaxHeight=System.Windows.SystemParameters.VirtualScreenHeight;}}}
dans C # winforms, j'ai un point de départ (pour le cas où nous avons plusieurs moniteurs / affichages et un formulaire en appelle un autre) à l'aide de la méthode suivante:
Réponses:
Screen.FromControl
,Screen.FromPoint
etScreen.FromRectangle
devrait vous aider. Par exemple dans WinForms, ce serait:Je ne connais pas d'appel équivalent pour WPF. Par conséquent, vous devez faire quelque chose comme cette méthode d'extension.
la source
window
sur le moniteur au - dessus de mon principal (par exemple, sonTop < 0
), aFromHandle
renvoyé leScreen
pour mon moniteur principal (même s'ilwindow
était complètement à l' intérieur le moniteur secondaire)!?! Soupir. Il semble que je devrais rechercherScreen.AllScreens
moi-même le tableau. Pourquoi les choses ne peuvent-elles pas "simplement fonctionner"?!? Arrrrgh.Vous pouvez l'utiliser pour obtenir les limites de l'espace de travail du bureau de l'écran principal:
System.Windows.SystemParameters.WorkArea
Ceci est également utile pour obtenir uniquement la taille de l'écran principal:
System.Windows.SystemParameters.PrimaryScreenWidth
System.Windows.SystemParameters.PrimaryScreenHeight
la source
Vous pourriez également avoir besoin de:
pour obtenir la taille combinée de tous les moniteurs et non d'un en particulier.
la source
PresentationFramework.dll
etusing System.Windows;
Ajout d'une solution qui n'utilise pas WinForms mais NativeMethods à la place. Vous devez d'abord définir les méthodes natives nécessaires.
Et puis obtenez la poignée du moniteur et les informations du moniteur comme ça.
la source
Ajouter à ffpf
la source
Attention au facteur d'échelle de vos fenêtres (100% / 125% / 150% / 200%). Vous pouvez obtenir la taille réelle de l'écran en utilisant le code suivant:
la source
Je voulais avoir la résolution de l'écran avant d'ouvrir la première de mes fenêtres, alors voici une solution rapide pour ouvrir une fenêtre invisible avant de mesurer réellement les dimensions de l'écran (vous devez adapter les paramètres de la fenêtre à votre fenêtre afin de vous assurer que les deux s'ouvrent le même écran - principalement le
WindowStartupLocation
est important)la source
Il s'agit d'une solution "Center Screen DotNet 4.5 ", utilisant SystemParameters au lieu de System.Windows.Forms ou My.Compuer.Screen : Depuis que Windows 8 a modifié le calcul de la dimension de l'écran, la seule façon dont cela fonctionne pour moi ressemble à ça (calcul de la barre des tâches inclus):
la source
J'avais besoin de définir la taille maximale de mon application de fenêtre. Celui-ci pourrait être modifié en fonction de l'affichage de l'application dans l'écran principal ou dans le secondaire. Pour surmonter ce problème, nous avons créé une méthode simple que je vous montre ensuite:
la source
dans C # winforms, j'ai un point de départ (pour le cas où nous avons plusieurs moniteurs / affichages et un formulaire en appelle un autre) à l'aide de la méthode suivante:
la source
WinForms
Pour les configurations multi-moniteurs, vous aurez également besoin d'un compte pour la position X et Y:
la source
Ce code de débogage devrait bien faire l'affaire:
Vous pouvez explorer les propriétés de la classe d'écran
Mettez tous les affichages dans un tableau ou une liste à l'aide de Screen.AllScreens puis capturez l'index de l'affichage actuel et ses propriétés.
C # (converti de VB par Telerik - Veuillez vérifier)
VB (code d'origine)
la source