Alteração da resposta aceita para refletir a melhor maneira de fazer isso no WPF. System.Windows.SystemParameters. *
chilltemp
1
A obsessão por não usar um espaço para nome WinForms parece estranha para mim, não ganha nada; em vez disso, deixa você sem as ferramentas necessárias para resolver adequadamente o problema.
Jeff Yates
4
Para mim, não se trata de WinForms vs. WPF. É sobre aprender algo novo. Não consigo decidir qual caminho é melhor se não aprender dos dois lados.
Chilltemp # 3/10
3
Bem, nesse cenário, não há "nos dois sentidos", pois há apenas uma maneira de fazer isso, que é usar o material WinForms.
Jeff Yates
@ Jeff Yates: Você está correto. Desenterrei o projeto original para o qual fiz essa pergunta e descobri que usava as propriedades PrimaryScreen *. Eles resolveram minhas necessidades do dia, mas não a pergunta real que eu fiz. Desculpe pelo desvio; Alterei a resposta aceita de acordo.
Chilltemp
Respostas:
143
Screen.FromControl, Screen.FromPointE Screen.FromRectangledeve ajudá-lo com isso. Por exemplo, no WinForms, seria:
Talvez minha marcação não tenha deixado claro que estou usando janelas WPF, não WinForms. Eu não tenho o System.Windows.Forms.dll mencionado e não funcionaria de qualquer maneira, pois o WPF tem sua própria árvore de herança.
Chilltemp 31/10/08
1
De nada. Peço desculpas por não ter chegado diretamente à resposta - tive que investigar o que estava disponível no WPF antes de atualizar minha postagem.
Jeff Yates
Isso funciona para colocar uma janela na borda direita: var bounds = this.GetScreen (). WorkingArea; this.Left = bounds.Right - this.Width; Mas requer referências a System.Windows.Forms e System.Drawing, o que não é o ideal.
Anthony
1
@evios Cuidado que esta chamada não reconhece DPI; você precisará fazer cálculos.
precisa
6
No meu aplicativo VS 2015 WPF direcionado ao .NET 4.5 no meu sistema de 4 monitores no Windows 10 Pro (v10.0.14393) com windowno monitor acima do meu primário (por exemplo, seu Top < 0), FromHandleretornei o Screendo meu monitor primário (mesmo que windowestivesse completamente dentro o monitor secundário)!?! Suspiro. Parece que vou ter que procurar no Screen.AllScreensArray sozinho. Por que as coisas não podem "simplesmente funcionar"?!? Arrrrgh.
Tom
62
Você pode usar isso para obter os limites do espaço de trabalho da área de trabalho da tela principal:
Estou confuso ... Isso parece retornar apenas as dimensões da tela principal. Eu quero saber as dimensões da tela da janela está atualmente em ...
VitalyB
1
isso não responde à pergunta e, mesmo que você queira apenas obter o tamanho da exibição principal, os SystemParameters (no WPF) estão incorretos. eles retornam unidades independentes de dispositivo e não pixels. para uma melhor implementação ver esta resposta: stackoverflow.com/questions/254197/...
Patrick Klug
1
PrimaryScreenHeight / Width funcionou exatamente como o esperado e o MSDN possui o seguinte: "Obtém um valor que indica a altura da tela, em pixels, do monitor principal". A WorkArea não diz especificamente pixels, mas a documentação e os exemplos de uso me levam a acreditar que também está em pixels. Você tem um link para algo que indica o uso de unidades independentes de dispositivo?
Isso é para a tela principal - e se a janela do aplicativo estiver em uma tela virtual (estendida) (por exemplo, se você tiver um ou dois monitores externos conectados ao seu PC)?
Matt
4
Eu queria ter a resolução da tela antes de abrir a primeira das minhas janelas, então aqui está uma solução rápida para abrir uma janela invisível antes de realmente medir as dimensões da tela (você precisa adaptar os parâmetros da janela à sua janela para garantir que ambos estejam abertos em a mesma tela - principalmente a WindowStartupLocationé 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
A principal questão é sobre a posição da tela. Como o instalador Msi, Innosetup ou outros, criei meu próprio instalador com verificação de CPU, verificação de permissão, verificação de driver e muito mais, muito simples de usar. Essa é a captura de tela sobre.
Nasenbaer
3
Eu precisava definir o tamanho máximo do meu aplicativo de janela. Este pode ser alterado de acordo com a aplicação apresentada na tela principal ou na secundária. Para superar esse problema, criamos um método simples que mostrarei a seguir:
/// <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;}}}
no winforms C #, tenho o ponto de partida (por exemplo, quando temos vários monitor / diplay e um formulário está chamando outro) com a ajuda do seguinte método:
Respostas:
Screen.FromControl
,Screen.FromPoint
EScreen.FromRectangle
deve ajudá-lo com isso. Por exemplo, no WinForms, seria:Não conheço uma chamada equivalente para WPF. Portanto, você precisa fazer algo como este método de extensão.
fonte
window
no monitor acima do meu primário (por exemplo, seuTop < 0
),FromHandle
retornei oScreen
do meu monitor primário (mesmo quewindow
estivesse completamente dentro o monitor secundário)!?! Suspiro. Parece que vou ter que procurar noScreen.AllScreens
Array sozinho. Por que as coisas não podem "simplesmente funcionar"?!? Arrrrgh.Você pode usar isso para obter os limites do espaço de trabalho da área de trabalho da tela principal:
System.Windows.SystemParameters.WorkArea
Isso também é útil para obter apenas o tamanho da tela principal:
System.Windows.SystemParameters.PrimaryScreenWidth
System.Windows.SystemParameters.PrimaryScreenHeight
fonte
Além disso, você pode precisar de:
para obter o tamanho combinado de todos os monitores e não um em particular.
fonte
PresentationFramework.dll
e #using System.Windows;
Adicionando uma solução que não usa WinForms, mas NativeMethods. Primeiro, você precisa definir os métodos nativos necessários.
E, em seguida, obtenha a alça do monitor e as informações do monitor assim.
fonte
Adicionar ao ffpf
fonte
Cuidado com o fator de escala de suas janelas (100% / 125% / 150% / 200%). Você pode obter o tamanho real da tela usando o seguinte código:
fonte
Eu queria ter a resolução da tela antes de abrir a primeira das minhas janelas, então aqui está uma solução rápida para abrir uma janela invisível antes de realmente medir as dimensões da tela (você precisa adaptar os parâmetros da janela à sua janela para garantir que ambos estejam abertos em a mesma tela - principalmente a
WindowStartupLocation
é importante)fonte
Esta é uma " solução Center Screen DotNet 4.5 ", usando SystemParameters em vez de System.Windows.Forms ou My.Compuer.Screen : Como o Windows 8 alterou o cálculo da dimensão da tela, a única maneira de funcionar para mim é assim (cálculo da barra de tarefas incluído):
fonte
Eu precisava definir o tamanho máximo do meu aplicativo de janela. Este pode ser alterado de acordo com a aplicação apresentada na tela principal ou na secundária. Para superar esse problema, criamos um método simples que mostrarei a seguir:
fonte
no winforms C #, tenho o ponto de partida (por exemplo, quando temos vários monitor / diplay e um formulário está chamando outro) com a ajuda do seguinte método:
fonte
WinForms
Para configurações de vários monitores, você também precisará ter em conta a posição X e Y:
fonte
Este código de depuração deve executar bem o truque:
Você pode explorar as propriedades da classe Screen
Coloque todas as exibições em uma matriz ou lista usando Screen.AllScreens e capture o índice da exibição atual e suas propriedades.
C # (convertido de VB por Telerik - verifique novamente)
VB (código original)
fonte