Condividi tramite


Impostazione della consapevolezza DPI predefinita per un processo

Le applicazioni desktop in Windows possono essere eseguite in diverse modalità di riconoscimento DPI. Queste modalità consentono un comportamento di ridimensionamento DPI diverso e possono usare spazi di coordinate diversi. Per altre informazioni sulla consapevolezza dpi, vedere Sviluppo di applicazioni desktop DPI elevate in Windows. È importante impostare in modo esplicito la modalità di riconoscimento DPI predefinita del processo in modo da evitare comportamenti imprevisti.

Esistono due metodi principali per specificare la consapevolezza DPI predefinita di un processo:

1) tramite un'impostazione del manifesto dell'applicazione

2) a livello di codice tramite una chiamata API

È consigliabile specificare la consapevolezza DPI predefinita del processo tramite un'impostazione del manifesto. Anche se è supportata l'impostazione predefinita tramite API, non è consigliabile.

Impostazione della consapevolezza predefinita con il manifesto dell'applicazione

Esistono due impostazioni del manifesto che consentono di specificare la modalità di riconoscimento DPI predefinita del processo: <dpiAwareness> e <dpiAware>. <DpiAware> è stato introdotto in Windows Vista e consente solo l'impostazione predefinita del processo sulla consapevolezza del sistema. <dpiAwareness> è stato introdotto in Windows 10 versione 1607 e consente di specificare un elenco ordinato di modalità di riconoscimento DPI predefinite per il processo. Ciò consente di impostare le modalità di riconoscimento DPI di backup, che verranno usate se l'applicazione viene eseguita in una versione di Windows non in grado di supportare la prima modalità di riconoscimento specificata. Nelle versioni precedenti di Windows il tag dpiAwareness> più recente <verrà ignorato. Ciò significa che è possibile usare entrambe queste impostazioni del manifesto per abilitare uno scenario in cui il processo predefinito potrebbe essere di conoscenza del sistema nella versione precedente di Windows mentre è Per-Monitor nelle versioni successive a Windows 10, versione 1607. In Windows 10 versione 1607 e su, l'impostazione <dpiAware> viene ignorata se è presente l'elemento <dpiAwareness> .

La tabella seguente illustra come specificare diverse modalità di riconoscimento DPI predefinite del processo usando le due impostazioni del manifesto:

Elaborare la modalità di riconoscimento DPI predefinita <Impostazione dpiAware> <impostazione dpiAwareness>
(Windows 10, versione 1607 e successive)
ignaro N/D (nessuna impostazione dpiAware nel manifesto)
or
<dpiAware false</dpiAware>>
<dpiAwareness unwareness></dpiAwareness>
Riconoscimento del sistema <dpiAware true</dpiAware>> <dpiAwareness>system</dpiAwareness>
Per Monitor <dpiAware true/pm<dpiAware>> <dpiAwareness>PerMonitor</dpiAwareness>
Per Monitor V2 Non supportato <dpiAwareness>PerMonitorV2</dpiAwareness>

 

L'esempio seguente mostra sia dpiAwareness> <che le <impostazioni dpiAware> usate all'interno dello stesso file manifesto per configurare il comportamento di riconoscimento DPI predefinito del processo per versioni diverse di 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>

Impostazione della consapevolezza predefinita a livello di codice

Anche se non è consigliabile, è possibile impostare la consapevolezza dpi predefinita a livello di codice. Dopo aver creato una finestra (HWND) nel processo, la modifica della modalità di riconoscimento DPI non è più supportata. Se si imposta la modalità di riconoscimento DPI predefinita del processo a livello di codice, è necessario chiamare l'API corrispondente prima che siano stati creati eventuali HWND.

Sono disponibili più API che consentono di specificare la consapevolezza DPI predefinita per il processo. L'API consigliata corrente è SetProcessDpiAwarenessContext, perché le API precedenti offrono meno funzionalità.

API Versione minima di Windows DPI non a conoscenza Riconoscimento DPI del sistema Riconoscimento DPI per 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 versione 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)

Impostazione predefinita del processo e impostazione predefinita del thread

Questo documento si riferisce all'impostazione della consapevolezza DPI predefinita per il processo. Questo perché Windows 10 ha introdotto il supporto per l'esecuzione di più modalità di riconoscimento DPI all'interno di un singolo processo (prima di Windows 10, l'intero processo doveva essere conforme a una singola modalità di riconoscimento DPI). Il supporto per l'esecuzione di più modalità di riconoscimento DPI all'interno di un processo viene definito "ridimensionamento DPI in modalità mista". Quando si usa il ridimensionamento DPI in modalità mista all'interno del processo, ogni finestra di primo livello può essere eseguita in una modalità di riconoscimento DPI che può essere diversa da quella del processo predefinito. A meno che non venga specificato in modo esplicito, per impostazione predefinita ogni thread verrà impostato sul processo predefinito al momento della creazione. Per altre informazioni sul ridimensionamento DPI in modalità mista, vedere l'articolo Ridimensionamento DPI in modalità mista e API compatibili con DPI.