Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Observação
Esta documentação destina-se a desenvolvedores do .NET Framework que desejam usar as classes de Automação de Interface do Usuário gerenciadas definidas no namespace System.Windows.Automation. Para obter as informações mais recentes sobre Automação de Interface do Usuário, consulte API de Automação do Windows: Automação de Interface do Usuário.
A partir do Windows Vista, o Windows permite que os usuários alterem a configuração de pontos por polegada (dpi) para que a maioria dos elementos de interface do usuário na tela pareça maior. Embora esse recurso esteja disponível há muito tempo no Windows, nas versões anteriores o dimensionamento tinha que ser implementado por aplicativos. A partir do Windows Vista, o Gerenciador de Janelas da Área de Trabalho executa o dimensionamento padrão para todos os aplicativos que não lidam com seu próprio dimensionamento. Os aplicativos cliente de Automação da Interface do Usuário devem levar esse recurso em conta.
Escalonamento no Windows Vista
A configuração de dpi padrão é 96, o que significa que 96 pixels ocupam uma largura ou altura de uma polegada nocional. A medida exata de uma "polegada" varia conforme a resolução física e o tamanho do monitor. Por exemplo, em um monitor de 12 polegadas de largura, em uma resolução horizontal de 1280 pixels, uma linha horizontal de 96 pixels se estende cerca de 9/10 de polegada.
Alterar a configuração de dpi não é o mesmo que alterar a resolução da tela. Com o dimensionamento de dpi, o número de pixels físicos na tela permanece o mesmo. No entanto, o dimensionamento é aplicado ao tamanho e ao local dos elementos da interface do usuário. Esse dimensionamento pode ser executado automaticamente pelo DWM (Gerenciador de Janelas da Área de Trabalho) para a área de trabalho e para aplicativos que não solicitam explicitamente que não sejam dimensionados.
Na verdade, quando o usuário define o fator de escala como 120 dpi, uma polegada vertical ou horizontal na tela fica maior em 25%. Todas as dimensões são dimensionadas adequadamente. O deslocamento de uma janela de aplicativo das bordas superior e esquerda da tela aumenta em 25%. Se o dimensionamento de aplicativos estiver habilitado e o aplicativo não estiver ciente do dpi, o tamanho da janela aumentará na mesma proporção, juntamente com os deslocamentos e tamanhos de todos os elementos de interface do usuário que ele contém.
Observação
Por padrão, o DWM não executa o dimensionamento para aplicativos sem reconhecimento de dpi quando o usuário define o dpi como 120, mas o executa quando o dpi é definido como um valor personalizado de 144 ou superior. No entanto, o usuário pode substituir o comportamento padrão.
O dimensionamento de tela cria novos desafios para aplicativos que estão preocupados de qualquer forma com coordenadas de tela. A tela agora contém dois sistemas de coordenadas: físico e lógico. As coordenadas físicas de um ponto representam o deslocamento real em pixels em relação ao canto superior esquerdo da origem. As coordenadas lógicas são os deslocamentos como seriam se os pixels em si fossem dimensionados.
Suponha que você projete uma caixa de diálogo com um botão nas coordenadas (100, 48). Quando essa caixa de diálogo é exibida no padrão 96 dpi, o botão está localizado em coordenadas físicas de (100, 48). Em 120 dpi, ele está localizado em coordenadas físicas de (125, 60). Mas as coordenadas lógicas são as mesmas em qualquer configuração de dpi: (100, 48).
As coordenadas lógicas são importantes, pois tornam o comportamento do sistema operacional e dos aplicativos consistente, independentemente da configuração de dpi. Por exemplo, Cursor.Position normalmente retorna as coordenadas lógicas. Se você mover o cursor sobre um elemento em uma caixa de diálogo, as mesmas coordenadas serão retornadas independentemente da configuração de dpi. Se você desenhar um controle em (100, 100), ele será desenhado para essas coordenadas lógicas e ocupará a mesma posição relativa em qualquer configuração de dpi.
Escala nos clientes da Automação da Interface do Usuário
A API de Automação da Interface do Usuário não usa coordenadas lógicas. Os métodos e propriedades a seguir retornam coordenadas físicas ou as tomam como parâmetros.
Por padrão, um aplicativo cliente de Automação de Interface do Usuário em execução em um ambiente não 96-dpi não será capaz de obter resultados corretos desses métodos e propriedades. Por exemplo, como a posição do cursor está em coordenadas lógicas, o cliente não pode simplesmente passar essas coordenadas para FromPoint obter o elemento que está sob o cursor. Além disso, o aplicativo não poderá colocar corretamente janelas fora de sua área de cliente.
A solução está em duas partes.
Primeiro, torne o aplicativo cliente com reconhecimento de dpi. Para fazer isso, chame a função
SetProcessDPIAware
Win32 na inicialização. No código gerenciado, a declaração a seguir disponibiliza essa função.[System.Runtime.InteropServices.DllImport("user32.dll")] internal static extern bool SetProcessDPIAware();
<System.Runtime.InteropServices.DllImport("user32.dll")> _ Friend Shared Function SetProcessDPIAware() As Boolean End Function
Essa função torna todo o processo com reconhecimento de dpi, o que significa que todas as janelas que pertencem ao processo não estão dimensionadas. No Exemplo do Realce, por exemplo, as quatro janelas que compõem o retângulo de realce estão localizadas nas coordenadas físicas obtidas da Automação da Interface do Usuário, não nas coordenadas lógicas. Se a amostra não tivesse reconhecimento de dpi, o realce seria desenhado nas coordenadas lógicas na área de trabalho, o que resultaria em um posicionamento incorreto em um ambiente que não fosse 96 dpi.
Para obter coordenadas de cursor, chame a função
GetPhysicalCursorPos
Win32. O exemplo a seguir mostra como declarar e usar essa função.public struct CursorPoint { public int X; public int Y; } [System.Runtime.InteropServices.DllImport("user32.dll")] internal static extern bool GetPhysicalCursorPos(ref CursorPoint lpPoint); private bool ShowUsage() { CursorPoint cursorPos = new CursorPoint(); try { return GetPhysicalCursorPos(ref cursorPos); } catch (EntryPointNotFoundException) // Not Windows Vista { return false; } }
Structure CursorPoint Public X As Integer Public Y As Integer End Structure <System.Runtime.InteropServices.DllImport("user32.dll")> _ Friend Shared Function GetPhysicalCursorPos(ByRef lpPoint As CursorPoint) As Boolean End Function Private Function ShowUsage() As Boolean Dim cursorPos As New CursorPoint() Try Return GetPhysicalCursorPos(cursorPos) Catch e As EntryPointNotFoundException ' Not Windows Vista Return False End Try End Function
Cuidado
Não use Cursor.Position. O comportamento dessa propriedade fora das janelas do cliente em um ambiente dimensionado é indefinido.
Se seu aplicativo executar comunicação direta entre processos com aplicativos sem reconhecimento de dpi, você pode ter que converter entre coordenadas lógicas e físicas usando as funções Win32 PhysicalToLogicalPoint
e LogicalToPhysicalPoint
.