プロセスの既定の DPI 認識を設定する
Windows 上のデスクトップ アプリケーションでは、さまざまな DPI 認識モードで実行できます。 これらのモードでは、さまざまな DPI スケーリング動作が可能になり、異なる座標空間を使用できます。 DPI 認識の詳細については、「Windows での高 DPI デスクトップ アプリケーション開発」を参照してください。 予期しない動作を回避するために、プロセスの既定の DPI 認識モードを明示的に設定することが重要です。
プロセスの既定の DPI 認識を指定するには、主に次の 2 つの方法があります。
1) アプリケーション マニフェストの設定を介して
2) API 呼び出しを使用してプログラム的に
マニフェスト設定を使用して、既定のプロセス DPI 認識を指定することが推奨されます。 API を使用した既定値の指定はサポートされていますが、推奨されません。
アプリケーション マニフェストを使用した既定の認識の設定
プロセスの既定の DPI 認識モードを指定できるマニフェスト設定には、<dpiAwareness> と <dpiAware> の 2 つがあります。 <dpiAware> は Windows Vista で導入され、プロセスの既定をシステム認識のみに設定できます。 <dpiAwareness> は Windows 10 バージョン 1607 で導入され、プロセスの既定の DPI 認識モードの順序付きリストを指定できます。 これにより、バックアップ DPI 認識モードを設定できます。これは、アプリケーションが Windows のバージョンで実行され、指定された最初の認識モードをサポートできない場合に使用されます。 古いバージョンの Windows では、新しい <dpiAwareness> タグは無視されます。 つまり、これらのマニフェスト設定の両方を使用すると、Windows の古いバージョンでプロセスの既定をシステム認識にしながら、Windows 10 バージョン 1607 以降のバージョンでは、Per-Monitor にするシナリオを有効にできる場合があります。 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> |
Per Monitor | <dpiAware>true/pm<dpiAware> | <dpiAwareness>PerMonitor</dpiAwareness> |
Per Monitor V2 | サポートされていません | <dpiAwareness>PerMonitorV2</dpiAwareness> |
次のサンプルは、<dpiAwareness> と <dpiAware> 設定の両方を同じマニフェスト ファイル内で使用して、さまざまなバージョンの Windows に対してプロセスの既定の DPI 認識動作を構成する方法を示しています。
<?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 未対応 | システム DPI 対応 | Per Monitor 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 バージョン 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 スケーリングと DPI 対応 API」の記事を参照してください。