Acessibilidade ativa e dimensionamento de tela do Windows Vista

O Windows Vista permite que os usuários alterem a configuração dpi (pontos por polegada) para que a maioria dos elementos da interface do usuário na tela pareça maior. Embora esse recurso esteja disponível há muito tempo no Microsoft Windows, em versões anteriores o dimensionamento precisava ser implementado por aplicativos. No 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 do Microsoft Active Accessibility devem levar esse recurso em conta.

Escala 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" depende do tamanho e da resolução física do monitor. Por exemplo, em um monitor de 12 polegadas de largura, com uma resolução horizontal de 1280 pixels, uma linha horizontal de 96 pixels se estende por cerca de 9/10 de polegada.

Alterar a configuração de dpi não é o mesmo que alterar a resolução da tela. Com a escala de dpi, o número de pixels físicos na tela permanece o mesmo. No entanto, a escala é aplicada ao tamanho e ao local dos elementos da interface do usuário. Essa escala pode ser aplicada automaticamente pelo DWM (Desktop Windows Manager, Gerenciador de Janelas da Área de Trabalho) no computador e nos 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 25% maior. Todas as dimensões são adequadamente alteradas. O deslocamento de uma janela das bordas superior e esquerda da tela aumenta em 25%. O tamanho da janela aumenta na mesma proporção, juntamente com os deslocamentos e tamanhos de todos os elementos de interface do usuário que ela contém.

Por padrão, o DWM não faz o dimensionamento em aplicativos sem reconhecimento de dpi quando o usuário define o dpi como 120, mas o executa quando o dpi está definido como um valor personalizado de 144 ou superior. No entanto, o usuário pode substituir o comportamento padrão.

A escala da tela traz novos desafios para aplicativos que se importam com as coordenadas da tela. A tela agora contém dois sistemas de coordenadas: físico e lógico. As coordenadas físicas de um ponto são o deslocamento real em pixels do canto superior esquerdo da origem. As coordenadas lógicas são os deslocamentos possíveis se os pixels em si fossem dimensionados.

Suponhamos que você crie uma caixa de diálogo com um botão nas coordenadas (100, 48). Quando essa caixa de diálogo for exibida no dpi padrão de 96, o botão estará localizado nas coordenadas físicas de (100, 48). Em 120 dpi, ele estará localizado nas 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 torna consistente o comportamento do sistema operacional e dos aplicativos, independentemente da configuração de dpi. Por exemplo, System.Windows.Forms.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.

Dimensionamento em clientes de acessibilidade ativa

A Acessibilidade Ativa da Microsoft não usa coordenadas lógicas. Os métodos e funções a seguir retornam coordenadas físicas ou as tomam como parâmetros.

Por padrão, um aplicativo cliente microsoft active accessibility em execução em um ambiente não 96 dpi não será capaz de obter os resultados corretos dessas chamadas. Por exemplo, como a posição do cursor está em coordenadas lógicas, o cliente não pode simplesmente passar essas coordenadas para AccessibleObjectFromPoint para obter o elemento que está sob o cursor.

Além disso, um aplicativo que cria uma janela fora de sua área de cliente, como um aplicativo de acessibilidade que realça elementos de interface do usuário focados, não criará a janela no local correto da tela, pois a janela será colocada nas coordenadas lógicas, não nas coordenadas físicas retornadas por IAccessible::accLocation.

A solução está em duas partes:

  • Torne o aplicativo cliente "com reconhecimento de dpi". Para fazer isso, chame a função SetProcessDPIAware na inicialização. Essa função faz com que todo o processo tenha reconhecimento de dpi, o que significa que todas as janelas que pertencem ao processo estão fora de escala.
  • Use funções com reconhecimento de dpi. Por exemplo, para obter coordenadas de cursor, chame a função GetPhysicalCursorPos . Não use GetCursorPos; seu comportamento em aplicativos com reconhecimento de dpi é indefinido.

Se seu aplicativo executar a comunicação entre processos diretos com aplicativos sem reconhecimento de dpi, você poderá ter convertido entre coordenadas lógicas e físicas usando as funções PhysicalToLogicalPoint e LogicalToPhysicalPoint .