プロセスの既定の DPI 認識の設定

Windows 上のデスクトップ アプリケーションは、さまざまな DPI 認識モードで実行できます。 これらのモードを使用すると、異なる DPI スケーリング動作が可能になり、異なる座標空間を使用できます。 DPI 対応の詳細については、「 Windows での高 DPI デスクトップ アプリケーション開発 」を参照してください。予期しない動作を回避するために、プロセスの既定の DPI 認識モードを明示的に設定することが重要です。

プロセスの既定の DPI 認識を指定するには、次の 2 つのメイン方法があります。

1) アプリケーション マニフェスト設定を使用する

2) API 呼び出しを使用したプログラムによる

マニフェスト設定を使用して、既定のプロセス DPI 認識を指定することをお勧めします。 API を使用した既定値の指定はサポートされていますが、お勧めしません。

アプリケーション マニフェストを使用した既定の認識の設定

プロセスの既定の DPI 認識モードを指定できるマニフェスト設定には、 <dpiAwareness> と <dpiAware の 2 つがあります>。 <dpiAware> は Windows Vista で導入され、プロセスの既定値をシステム認識に設定することのみを可能にします。 <dpiAwareness> はバージョン 1607 Windows 10で導入され、プロセスの既定の DPI 認識モードの順序付きリストを指定できます。 これにより、バックアップ DPI 認識モードを設定できます。これは、アプリケーションが Windows のバージョンで実行され、指定された最初の認識モードをサポートできない場合に使用されます。 以前のバージョンの Windows では、新しい <dpiAwareness> タグは無視されます。 つまり、これらのマニフェスト設定の両方を使用して、プロセスの既定値が、Windows 10 バージョン 1607 より大きいバージョンでPer-Monitorされている間に、古いバージョンの Windows でシステム認識になる可能性があるシナリオを有効にすることができます。 Windows 10バージョン 1607 以降では、<dpiAwareness> 要素が存在する<場合、dpiAware> 設定は無視されます。

次の表は、2 つのマニフェスト設定を使用して、さまざまなプロセスの既定の DPI 認識モードを指定する方法を示しています。

既定の DPI 認識モードを処理する <dpiAware> の設定 <dpiAwareness> 設定 (Windows 10、バージョン 1607 以降)
知らない

N/A (マニフェストに dpiAware 設定なし)

または

<dpiAware>false</dpiAware>

<dpiAwareness>unaware</dpiAwareness>
システム対応 <dpiAware>true</dpiAware> <dpiAwareness>system</dpiAwareness>
モニターごと <dpiAware>true/pm<dpiAware> <dpiAwareness>PerMonitor</dpiAwareness>
モニターごと V2 サポートされていません <dpiAwareness>PerMonitorV2</dpiAwareness>

 

次のサンプルは、異なるバージョンの <Windows に対してプロセスの既定の DPI 認識動作を構成するために、同じマニフェスト ファイル内で使用されている dpiAware 設定> と <dpiAware> 設定の両方を示しています。

<?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>

プログラムによる既定の認識の設定

推奨されませんが、既定の DPI 認識をプログラムで設定できます。 プロセスでウィンドウ (HWND) が作成されると、DPI 認識モードの変更はサポートされなくなりました。 プロセスの既定の DPI 認識モードをプログラムで設定する場合は、HWND が作成される前に対応する API を呼び出す必要があります。

プロセスの既定の DPI 認識を指定できる複数の API があります。 古い API では機能が少ないため、現在推奨されている API は SetProcessDpiAwarenessContext です。

 

API Windows の最小バージョン DPI Unaware システム DPI 対応 モニターごとの DPI 対応
SetProcessDPIAware Windows Vista 該当なし SetProcessDPIAware() 該当なし
SetProcessDpiAwareness Windows 8.1 SetProcessDpiAwareness(PROCESS_DPI_UNAWARE) SetProcessDpiAwareness(PROCESS_SYSTEM_DPI_AWARE) SetProcessDpiAwareness(PROCESS_PER_MONITOR_DPI_AWARE)
SetProcessDpiAwarenessContext Windows 10 Version 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)

 

プロセスの既定値とスレッドの既定値

このドキュメントでは、プロセスの既定の DPI 認識を設定することを指します。 これは、Windows 10が 1 つのプロセス内で複数の DPI 認識モードを実行するためのサポートを導入したためです (Windows 10より前は、プロセス全体が 1 つの DPI 認識モードに準拠する必要がありました)。 プロセス内で複数の DPI 認識モードを実行するためのサポートは、"混合モード DPI スケーリング" と呼ばれます。 プロセス内で混合モード DPI スケーリングを使用する場合、各最上位ウィンドウは、プロセスの既定とは異なる DPI 認識モードで実行できます。 明示的に指定しない限り、各スレッドは作成時に既定のプロセスに既定で設定されます。 混合モード DPI スケーリングの詳細については、混合モード DPI スケーリング に関する記事を参照してください。