Se cambió la respuesta aceptada para reflejar la mejor manera de hacer esto desde WPF. System.Windows.SystemParameters. *
chilltemp
1
La obsesión por no usar un espacio de nombres WinForms me parece extraña, no te gana nada; en cambio, te deja sin las herramientas que necesitas para resolver adecuadamente el problema.
Jeff Yates
44
Para mí, no se trata de WinForms vs.WPF. Se trata de aprender algo nuevo. No puedo decidir qué camino es mejor si no aprendo los dos.
chilltemp
3
Bueno, en este escenario no hay "ambas formas", ya que solo hay una manera de hacer esto, que es usar las cosas de WinForms.
Jeff Yates
@ Jeff Yates: Tienes razón. Desenterré el proyecto original para el que hice esta pregunta y descubrí que usaba las propiedades de PrimaryScreen *. Resolvieron mis necesidades del día, pero no la pregunta real que hice. Perdón por la vuelta; He cambiado la respuesta aceptada en consecuencia.
chilltemp
Respuestas:
143
Screen.FromControl, Screen.FromPointy Screen.FromRectangledebería ayudarte con esto. Por ejemplo en WinForms sería:
Quizás mi etiquetado no dejó en claro que estoy usando ventanas WPF, no WinForms. No tengo el System.Windows.Forms.dll referenciado, y no funcionaría de todos modos ya que WPF tiene su propio árbol de herencia.
chilltemp
1
De nada. Mis disculpas por no llegar directamente a la respuesta: tuve que investigar lo que estaba disponible en WPF antes de actualizar mi publicación.
Jeff Yates el
Esto funciona para poner una ventana en el borde derecho: var limits = this.GetScreen (). WorkingArea; this.Left = limits.Right - this.Width; Pero requiere referencias a System.Windows.Forms y System.Drawing, lo cual no es ideal.
Anthony
1
@devios Tenga en cuenta que esta llamada no es compatible con DPI; Necesitarás hacer cálculos.
Lynn Desmoronando el
66
En mi aplicación VS 2015 WPF dirigida a .NET 4.5 en mi sistema de 4 monitores en Windows 10 Pro (v10.0.14393) con windowel monitor encima de mi primario (por ejemplo, su Top < 0), FromHandledevolvió el Screenpara mi monitor primario (aunque windowestaba completamente dentro el monitor secundario) Suspiro. Parece que tendré que buscar la Screen.AllScreensmatriz yo mismo. ¿Por qué las cosas no pueden "simplemente funcionar"? Arrrrgh.
Tom
62
Puede usar esto para obtener los límites del espacio de trabajo de la pantalla principal:
Estoy confundido ... Esto solo parece devolver las dimensiones de la pantalla principal. Quiero saber las dimensiones de la pantalla en la que se encuentra actualmente la ventana ...
VitalyB
1
esto no responde la pregunta e incluso si solo desea obtener el tamaño de la pantalla principal, los Parámetros del sistema (en WPF) son incorrectos. devuelven unidades independientes del dispositivo y no píxeles. para una mejor implementación, vea esta respuesta: stackoverflow.com/questions/254197/…
Patrick Klug
1
PrimaryScreenHeight / Width funcionó exactamente como se esperaba, y MSDN tiene lo siguiente: "Obtiene un valor que indica la altura de la pantalla, en píxeles, del monitor de visualización principal". WorkArea no dice específicamente píxeles, pero la documentación y los ejemplos de uso me llevan a creer que también está en píxeles. ¿Tiene un enlace a algo que indique el uso de unidades independientes del dispositivo?
Tenga cuidado con el factor de escala de sus ventanas (100% / 125% / 150% / 200%). Puede obtener el tamaño de pantalla real utilizando el siguiente código:
Eso es para la pantalla principal: ¿qué sucede si la ventana de su aplicación está en una pantalla virtual (extendida) (es decir, tiene uno o dos monitores externos conectados a su PC)?
Matt
4
Quería tener la resolución de la pantalla antes de abrir la primera de mis ventanas, así que aquí una solución rápida para abrir una ventana invisible antes de medir realmente las dimensiones de la pantalla (debe adaptar los parámetros de la ventana a su ventana para asegurarse de que ambas estén abiertas la misma pantalla, principalmente WindowStartupLocationes importante)
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
La pregunta principal es sobre la posición de la pantalla. Al igual que el instalador Msi, Innosetup u otros, creé mi propio instalador con verificación de CPU, verificación de permisos, verificación de controladores y mucho más, muy simple de usar. Esa es la captura de pantalla sobre.
Nasenbaer
3
Necesitaba establecer el tamaño máximo de mi aplicación de ventana. Este podría cambiar en consecuencia, la aplicación se muestra en la pantalla principal o en la secundaria. Para superar este problema, creé un método simple que le muestro a continuación:
/// <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;}}}
en C # winforms tengo un punto de inicio (para el caso cuando tenemos varios monitores / diplay y un formulario llama a otro) con la ayuda del siguiente método:
Respuestas:
Screen.FromControl
,Screen.FromPoint
yScreen.FromRectangle
debería ayudarte con esto. Por ejemplo en WinForms sería:No sé de una llamada equivalente para WPF. Por lo tanto, debe hacer algo como este método de extensión.
fuente
window
el monitor encima de mi primario (por ejemplo, suTop < 0
),FromHandle
devolvió elScreen
para mi monitor primario (aunquewindow
estaba completamente dentro el monitor secundario) Suspiro. Parece que tendré que buscar laScreen.AllScreens
matriz yo mismo. ¿Por qué las cosas no pueden "simplemente funcionar"? Arrrrgh.Puede usar esto para obtener los límites del espacio de trabajo de la pantalla principal:
System.Windows.SystemParameters.WorkArea
Esto también es útil para obtener solo el tamaño de la pantalla principal:
System.Windows.SystemParameters.PrimaryScreenWidth
System.Windows.SystemParameters.PrimaryScreenHeight
fuente
También puede necesitar:
para obtener el tamaño combinado de todos los monitores y no uno en particular.
fuente
PresentationFramework.dll
yusing System.Windows;
Agregar una solución que no usa WinForms sino NativeMethods. Primero debe definir los métodos nativos necesarios.
Y luego obtenga el asa del monitor y la información del monitor como esta.
fuente
Agregar a ffpf
fuente
Tenga cuidado con el factor de escala de sus ventanas (100% / 125% / 150% / 200%). Puede obtener el tamaño de pantalla real utilizando el siguiente código:
fuente
Quería tener la resolución de la pantalla antes de abrir la primera de mis ventanas, así que aquí una solución rápida para abrir una ventana invisible antes de medir realmente las dimensiones de la pantalla (debe adaptar los parámetros de la ventana a su ventana para asegurarse de que ambas estén abiertas la misma pantalla, principalmente
WindowStartupLocation
es importante)fuente
Esta es una " solución Center Screen DotNet 4.5 ", que utiliza SystemParameters en lugar de System.Windows.Forms o My.Compuer.Screen : dado que Windows 8 ha cambiado el cálculo de la dimensión de la pantalla, la única forma en que funciona para mí es así (cálculo de la barra de tareas incluido):
fuente
Necesitaba establecer el tamaño máximo de mi aplicación de ventana. Este podría cambiar en consecuencia, la aplicación se muestra en la pantalla principal o en la secundaria. Para superar este problema, creé un método simple que le muestro a continuación:
fuente
en C # winforms tengo un punto de inicio (para el caso cuando tenemos varios monitores / diplay y un formulario llama a otro) con la ayuda del siguiente método:
fuente
WinForms
Para configuraciones de monitores múltiples también necesitará tener en cuenta la posición X e Y:
fuente
Este código de depuración debería funcionar bien:
Puede explorar las propiedades de la clase de pantalla
Coloque todas las pantallas en una matriz o lista usando Screen.AllScreens y luego capture el índice de la pantalla actual y sus propiedades.
C # (Convertido de VB por Telerik - Por favor verifique dos veces)
VB (código original)
fuente