Compartilhar via


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

Importante  

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.

 
O reconhecimento de DPI para um aplicativo deve ser definido por meio do manifesto do aplicativo para que ele seja determinado antes de qualquer ação que dependa do DPI do sistema. Como alternativa, você pode definir o reconhecimento de DPI usando SetProcessDpiAwareness, mas, se fizer isso, precisará defini-lo antes de executar qualquer ação dependente do DPI do sistema. Depois de definir o reconhecimento de DPI para um processo, ele não poderá ser alterado.
Dica  

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.

 
PROCESS_DPI_UNAWARE e aplicativos PROCESS_SYSTEM_DPI_AWARE não precisam responder a WM_DPICHANGED e não devem lidar com alterações no DPI. O sistema dimensionará automaticamente esses tipos de aplicativos para cima ou para baixo conforme necessário quando o DPI for alterado. PROCESS_PER_MONITOR_DPI_AWARE aplicativos são responsáveis por reconhecer e responder a alterações no DPI, sinalizadas por WM_DPICHANGED. Eles não serão dimensionados pelo sistema. Se um aplicativo desse tipo não redimensionar a janela e seu conteúdo, ele parecerá aumentar ou reduzir pelas alterações relativas do DPI à medida que a janela é movida de uma exibição para outra com uma configuração de DPI diferente.
Dica  

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.

 
Para entender a importância e o impacto dos diferentes valores de reconhecimento de DPI, considere um usuário que tenha três telas: A, B e C. A exibição A está definida como fator de dimensionamento de 100% (96 DPI), a exibição B está definida como fator de dimensionamento de 200% (192 DPI) e a exibição C está definida como fator de dimensionamento de 300% (288 DPI). O DPI do sistema está definido como 200%.

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

Confira também

DPI_AWARENESS