Configurando o reconhecimento de DPI padrão para um processo
Os aplicativos da área de trabalho no Windows podem ser executados em diferentes modos de reconhecimento de DPI. Esses modos permitem diferentes comportamentos de dimensionamento de DPI e podem usar diferentes espaços de coordenadas. Para obter mais informações sobre o reconhecimento de DPI, consulte Desenvolvimento de aplicativos de área de trabalho de DPI alto no Windows. É importante que você defina explicitamente o modo de reconhecimento de DPI padrão do processo para evitar comportamentos inesperados.
Há dois métodos principais para especificar o reconhecimento de DPI padrão de um processo:
1) por meio de uma configuração de manifesto do aplicativo
2) programaticamente por meio de uma chamada de API
Recomendamos que você especifique o reconhecimento de DPI do processo padrão por meio de uma configuração de manifesto. Embora a especificação do padrão via API seja suportada, não é recomendado.
Configurando o reconhecimento padrão com o manifesto do aplicativo
Há duas configurações de manifesto que permitem especificar o modo de reconhecimento de DPI padrão do processo: <dpiAwareness> e <dpiAware>. O <dpiAware> foi apresentado no Windows Vista e só permite que o padrão do processo seja definido como reconhecimento do sistema. O <dpiAwareness> foi apresentado no Windows 10, versão 1607 e permite que você especifique uma lista ordenada de modos de reconhecimento de DPI padrão do processo. Isso permite que você defina modos de reconhecimento de DPI de backup, que serão usados se o aplicativo for executado em uma versão do Windows incapaz de dar suporte ao primeiro modo de reconhecimento especificado. Em versões mais antigas do Windows, a marcação <dpiAwareness> será ignorada. Isso significa que você pode usar essas duas configurações de manifesto para habilitar um cenário em que o padrão do processo pode ser o reconhecimento do sistema na versão mais antiga do Windows enquanto é por monitor em versões maiores que Windows 10, versão 1607. No Windows 10, versão 1607, e versões posteriores, a configuração <dpiAware> é ignorada se o elemento <dpiAwareness> está presente.
A tabela a seguir mostra como especificar diferentes modos de reconhecimento de DPI padrão do processo usando as duas configurações de manifesto:
Modo de reconhecimento de DPI padrão do processo | Configuração <dpiAware> | Configuração <dpiAwareness> (Windows 10, versão 1607 e posterior) |
---|---|---|
sem reconhecimento | N/A (sem configuração dpiAware no manifesto) ou <dpiAware>false</dpiAware> |
<dpiAwareness>unaware</dpiAwareness> |
Reconhecimento do sistema | <dpiAware>true</dpiAware> | <dpiAwareness>system</dpiAwareness> |
Por monitor | <dpiAware>true/pm<dpiAware> | <dpiAwareness>PerMonitor</dpiAwareness> |
Por monitor V2 | Sem suporte | <dpiAwareness>PerMonitorV2</dpiAwareness> |
O exemplo a seguir mostra as configurações <dpiAwareness> e <dpiAware> sendo usadas no mesmo arquivo de manifesto para configurar o comportamento de reconhecimento de DPI padrão do processo para diferentes versões do Windows.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
<asmv3:application>
<asmv3:windowsSettings>
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
<dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2</dpiAwareness>
</asmv3:windowsSettings>
</asmv3:application>
</assembly>
Configurando o reconhecimento padrão programaticamente
Embora não seja recomendado, é possível definir o reconhecimento de DPI padrão programaticamente. Depois que uma janela (um HWND) for criada em seu processo, não haverá mais suporte para alterar o modo de reconhecimento de DPI. Se você estiver definindo o modo de reconhecimento de DPI padrão do processo programaticamente, deverá chamar a API correspondente antes que qualquer HWNDs tenha sido criado.
Há várias APIs que permitem especificar o reconhecimento de DPI padrão para seu processo. A API recomendada atualmente é SetProcessDpiAwarenessContext, pois as APIs mais antigas oferecem menos funcionalidades.
API | Versão mínima do Windows | Sem reconhecimento de DPI | Reconhecimento de DPI do sistema | Reconhecimento de DPI por monitor |
---|---|---|---|---|
SetProcessDPIAware | Windows Vista | N/D | SetProcessDPIAware() | N/D |
SetProcessDpiAwareness | Windows 8.1 | SetProcessDpiAwareness(PROCESS_DPI_UNAWARE) | SetProcessDpiAwareness(PROCESS_SYSTEM_DPI_AWARE) | SetProcessDpiAwareness(PROCESS_PER_MONITOR_DPI_AWARE) |
SetProcessDpiAwarenessContext | Windows 10, versão 1607 | SetProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT_UNAWARE) | SetProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT_SYSTEM_AWARE) | SetProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE) SetProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2) |
Padrão de processo vs. padrão de thread
Este documento refere-se à configuração do reconhecimento de DPI padrão para o seu processo. Isso ocorre porque o Windows 10 introduziu suporte para executar mais de um modo de reconhecimento de DPI em um único processo (antes do Windows 10, todo o processo precisava estar em conformidade com um único modo de reconhecimento de DPI). O suporte para executar mais de um modo de reconhecimento de DPI em um processo é chamado de "dimensionamento de DPI de modo misto". Ao usar o dimensionamento de DPI de modo misto em seu processo, cada janela de nível superior pode ser executada em um modo de reconhecimento de DPI que pode ser diferente do padrão do processo. A menos que especificado explicitamente, cada thread assumirá como padrão o padrão do processo quando criado. Para obter mais informações sobre o dimensionamento de DPI de modo misto, consulte o artigo Dimensionamento de DPI de modo misto e APIs com reconhecimento de DPI.