PROCESS_DPI_AWARENESS enumeração (shellscalingapi.h)
Identifica os valores de reconhecimento de pontos por polegada (dpi). O reconhecimento de DPI indica quanto trabalho de dimensionamento um aplicativo executa para DPI versus quanto é feito pelo sistema.
Os usuários têm a capacidade de definir o fator de escala de DPI em suas exibições independentes uns dos outros. Alguns aplicativos herdados não são capazes de ajustar seu dimensionamento para várias configurações de DPI. Para que os usuários usem esses aplicativos sem que o conteúdo apareça muito grande ou pequeno em telas, o Windows pode aplicar a virtualização de DPI a um aplicativo, fazendo com que ele seja dimensionado automaticamente pelo sistema para corresponder ao DPI da exibição atual. O valor PROCESS_DPI_AWARENESS indica qual nível de dimensionamento seu aplicativo lida por conta própria e quanto é fornecido pelo Windows. Tenha em mente que os aplicativos dimensionados pelo sistema podem parecer desfocados e lerão dados virtualizados sobre o monitor para manter a compatibilidade.
Syntax
typedef enum PROCESS_DPI_AWARENESS {
PROCESS_DPI_UNAWARE = 0,
PROCESS_SYSTEM_DPI_AWARE = 1,
PROCESS_PER_MONITOR_DPI_AWARE = 2
} ;
Constantes
PROCESS_DPI_UNAWARE Valor: 0 DPI sem reconhecimento. Esse aplicativo não é dimensionado para alterações de DPI e é sempre considerado ter um fator de escala de 100% (96 DPI). Ele será dimensionado automaticamente pelo sistema em qualquer outra configuração de DPI. |
PROCESS_SYSTEM_DPI_AWARE Valor: 1 Reconhecimento de DPI do sistema. Este aplicativo não é dimensionado para alterações de DPI. Ele consultará o DPI uma vez e usará esse valor durante o tempo de vida do aplicativo. Se o DPI for alterado, o aplicativo não se ajustará ao novo valor de DPI. Ele será dimensionado ou reduzido automaticamente pelo sistema quando o DPI for alterado do valor do sistema. |
PROCESS_PER_MONITOR_DPI_AWARE Valor: 2 Reconhecimento de DPI por monitor. Esse aplicativo verifica o DPI quando ele é criado e ajusta o fator de escala sempre que o DPI é alterado. Esses aplicativos não são dimensionados automaticamente pelo sistema. |
Comentários
As versões anteriores do Windows exigiam que você definisse o reconhecimento de DPI para todo o aplicativo. Agora, o reconhecimento de DPI está vinculado a threads, processos ou janelas individuais. Isso significa que o reconhecimento de DPI pode mudar enquanto o aplicativo está em execução e que várias janelas podem ter seus próprios valores de reconhecimento de DPI independentes. Consulte DPI_AWARENESS para obter mais informações sobre como o reconhecimento de DPI funciona no momento. As recomendações abaixo sobre como definir o reconhecimento de DPI no manifesto do aplicativo ainda têm suporte, mas a recomendação atual é usar o DPI_AWARENESS_CONTEXT.
Se o aplicativo for PROCESS_DPI_UNAWARE, não será necessário definir nenhum valor no manifesto do aplicativo. PROCESS_DPI_UNAWARE é o valor padrão para aplicativos, a menos que outro valor seja especificado.
Nas versões anteriores do Windows, não havia configuração para PROCESS_PER_MONITOR_DPI_AWARE. Os aplicativos não tinham conhecimento do DPI ou tinham reconhecimento de DPI. Aplicativos herdados que foram classificados como com reconhecimento de DPI antes de Windows 8.1 são considerados com uma configuração PROCESS_DPI_AWARENESS de PROCESS_SYSTEM_DPI_AWARE nas versões atuais do Windows.
Um aplicativo PROCESS_DPI_UNAWARE sempre usará um fator de dimensionamento de 100% (96 DPI). Nesse cenário, uma janela PROCESS_DPI_UNAWARE é criada com um tamanho de 500 por 500. Na exibição A, ele será renderizado nativamente sem dimensionamento. Nos monitores B e C, ele será escalado verticalmente pelo sistema automaticamente por um fator de 2 e 3, respectivamente. Isso ocorre porque um PROCESS_DPI_UNAWARE sempre pressupõe um DPI de 96 e as contas do sistema para isso. Se o aplicativo consultar o tamanho da janela, ele sempre obterá um valor de 500 por 500, independentemente da exibição em que ele está. Se esse aplicativo solicitar o DPI de qualquer um dos três monitores, ele receberá 96.
Agora, considere um aplicativo PROCESS_SYSTEM_DPI_AWARE. Lembre-se de que, no exemplo, o DPI do sistema é 200% ou 192 DPI. Isso significa que todas as janelas criadas por este aplicativo serão renderizadas nativamente na exibição B. Se a janela se mover para exibir A, ela será automaticamente dimensionada para baixo por um fator de 2. Isso ocorre porque um aplicativo PROCESS_SYSTEM_DPI_AWARE nesse cenário pressupõe que o DPI sempre será 192. Ele consulta o DPI na inicialização e nunca o altera. O sistema acomoda isso reduzindo verticalmente automaticamente ao mover para exibir A. Da mesma forma, se a janela se mover para exibir C, o sistema será dimensionado automaticamente por um fator de 1,5. Se o aplicativo consultar o tamanho da janela, ele sempre obterá o mesmo valor, semelhante a PROCESS_DPI_UNAWARE. Se ele solicitar o DPI de qualquer um dos três monitores, ele receberá 192.
Ao contrário dos outros valores de conscientização, PROCESS_PER_MONITOR_DPI_AWARE deve se adaptar à exibição em que está. Isso significa que ele é sempre renderizado nativamente e nunca é dimensionado pelo sistema. A responsabilidade está no aplicativo para ajustar o fator de escala ao receber a mensagem de WM_DPICHANGED . Parte dessa mensagem inclui um rect sugerido para a janela. Essa sugestão é a janela atual dimensionada do valor DPI antigo para o novo valor de DPI. Por exemplo, uma janela de 500 por 500 na tela A e movida para a exibição B receberá um rect de janela sugerido que é 1000 por 1000. Se essa mesma janela for movida para exibir C, o rect de janela sugerido anexado a WM_DPICHANGED será 1500 por 1500. Além disso, quando esse aplicativo consulta o tamanho da janela, ele sempre obtém o valor nativo real. Da mesma forma, se ele solicitar o DPI de qualquer um dos três monitores, ele receberá 96, 192 e 288, respectivamente.
Devido à virtualização de DPI, se um aplicativo consultar outro com um nível de reconhecimento diferente para informações dependentes de DPI, o sistema dimensionará automaticamente os valores para corresponder ao nível de reconhecimento do chamador. Um exemplo disso é se você chamar GetWindowRect e passar uma janela criada por outro aplicativo. Usando a situação descrita acima, suponha que um aplicativo PROCESS_DPI_UNAWARE criou uma janela de 500 por 500 na exibição C. Se você consultar a rect da janela de um aplicativo diferente, o tamanho do rect variará com base no reconhecimento de DPI do seu aplicativo.
PROCESS_DPI_UNAWARE | Você obterá um rect de 500 por 500 porque o sistema assumirá um DPI de 96 e reduzirá automaticamente o rect real em um fator de 3. |
PROCESS_SYSTEM_DPI_AWARE | Você obterá um rect 1000 by 1000 porque o sistema assumirá um DPI de 192 e dimensionará automaticamente o rect real para baixo em um fator de 3/2. |
PROCESS_PER_MONITOR_DPI_AWARE | Você receberá um rect 1500 by 1500 porque o sistema usará o DPI real da exibição e não fará nenhum dimensionamento nos bastidores. |
Exemplos
Este snippet demonstra como definir um valor de PROCESS_SYSTEM_DPI_AWARE no manifesto do aplicativo.
<dpiAware>true</dpiAware>
Este snippet demonstra como definir um valor de PROCESS_PER_MONITOR_DPI_AWARE no manifesto do aplicativo.
<dpiAware>true/PM</dpiAware>
Requisitos
Requisito | Valor |
---|---|
Cliente mínimo com suporte | Windows 8.1 [somente aplicativos da área de trabalho] |
Servidor mínimo com suporte | Windows Server 2012 R2 [somente aplicativos da área de trabalho] |
Cabeçalho | shellscalingapi.h |