Win32 API 日本語リファレンス
ホームUI.HiDpi › PROCESS_DPI_AWARENESS

PROCESS_DPI_AWARENESS

列挙型
基底型i4

メンバー 3

名前10進16進説明
PROCESS_DPI_UNAWARE00x0DPI 非対応です。このアプリは DPI の変化に合わせたスケーリングを行わず、常に拡大縮小率 100% (96 DPI) であるとみなされます。それ以外の DPI 設定では、システムによって自動的にスケーリングされます。
PROCESS_SYSTEM_DPI_AWARE10x1システム DPI 対応です。このアプリは DPI の変化に合わせたスケーリングを行いません。DPI を一度だけ問い合わせ、その値をアプリの実行中ずっと使用します。DPI が変化しても、アプリは新しい DPI 値に合わせて調整しません。DPI がシステムの値から変化した場合は、システムによって自動的に拡大または縮小されます。
PROCESS_PER_MONITOR_DPI_AWARE20x2モニターごとの DPI 対応です。このアプリは作成時に DPI を確認し、DPI が変化するたびに拡大縮小率を調整します。これらのアプリケーションはシステムによって自動的にスケーリングされることはありません。

公式ドキュメント

ドット/インチ (dpi) の認識レベルを識別します。DPI 認識は、DPI に対するスケーリング処理をアプリケーションがどの程度自身で行い、システムがどの程度行うかを示します。

ユーザーは、各ディスプレイの拡大縮小率 (DPI) をそれぞれ独立して設定できます。一部のレガシー アプリケーションは、複数の DPI 設定に合わせてスケーリングを調整できません。こうしたアプリケーションでも、ディスプレイ上でコンテンツが大きすぎたり小さすぎたりせずに使用できるように、Windows はアプリケーションに DPI 仮想化を適用し、現在のディスプレイの DPI に合わせてシステムが自動的にスケーリングできます。PROCESS_DPI_AWARENESS の値は、アプリケーションが自身でどのレベルのスケーリングを処理し、どの程度を Windows が提供するかを示します。システムによってスケーリングされたアプリケーションは表示がぼやける場合があり、互換性を維持するためにモニターに関する仮想化されたデータを読み取ることに注意してください。

解説(Remarks)

重要

以前のバージョンの Windows では、アプリケーション全体に対して DPI 認識を設定する必要がありました。現在、DPI 認識は個々のスレッド、プロセス、またはウィンドウに関連付けられます。つまり、アプリの実行中に DPI 認識が変化する可能性があり、複数のウィンドウがそれぞれ独立した DPI 認識の値を持つことができます。現在の DPI 認識の動作の詳細については、DPI_AWARENESS を参照してください。以下で説明するアプリケーション マニフェストで DPI 認識を設定する方法も引き続きサポートされますが、現在推奨されるのは DPI_AWARENESS_CONTEXT を使用する方法です。

アプリケーションの DPI 認識は、システムの DPI に依存する処理が行われる前に確定するよう、アプリケーション マニフェストで設定してください。代わりに SetProcessDpiAwareness を使用して DPI 認識を設定することもできますが、その場合はシステム DPI に依存する処理を行う前に必ず設定する必要があります。プロセスの DPI 認識をいったん設定すると、変更することはできません。
ヒント

アプリが PROCESS_DPI_UNAWARE の場合、アプリケーション マニフェストに値を設定する必要はありません。他の値が指定されない限り、PROCESS_DPI_UNAWARE がアプリの既定値です。

PROCESS_DPI_UNAWARE および PROCESS_SYSTEM_DPI_AWARE のアプリは WM_DPICHANGED に応答する必要はなく、DPI の変化を処理することも想定されていません。DPI が変化したときは、必要に応じてシステムがこれらの種類のアプリを自動的に拡大または縮小します。PROCESS_PER_MONITOR_DPI_AWARE のアプリは、WM_DPICHANGED によって通知される DPI の変化を認識して対応する責任があります。これらはシステムによってスケーリングされません。この種類のアプリがウィンドウとその内容のサイズを変更しない場合、DPI 設定の異なるディスプレイ間でウィンドウを移動すると、相対的な DPI の変化に応じて拡大または縮小されたように見えます。
ヒント

以前のバージョンの Windows には、PROCESS_PER_MONITOR_DPI_AWARE に相当する設定はありませんでした。アプリは DPI 非対応か DPI 対応のいずれかでした。Windows 8.1 より前に DPI 対応として分類されていたレガシー アプリケーションは、現在のバージョンの Windows では PROCESS_DPI_AWARENESS の設定が PROCESS_SYSTEM_DPI_AWARE であるとみなされます。

それぞれの DPI 認識の値がもつ重要性と影響を理解するために、A、B、C の 3 台のディスプレイを使用しているユーザーを考えます。ディスプレイ A は拡大縮小率 100% (96 DPI)、ディスプレイ B は拡大縮小率 200% (192 DPI)、ディスプレイ C は拡大縮小率 300% (288 DPI) に設定されています。システム DPI は 200% に設定されています。

PROCESS_DPI_UNAWARE のアプリケーションは、常に拡大縮小率 100% (96 DPI) を使用します。このシナリオで、PROCESS_DPI_UNAWARE のウィンドウが 500 × 500 のサイズで作成されたとします。ディスプレイ A では、スケーリングされずにネイティブに描画されます。ディスプレイ B と C では、システムによってそれぞれ 2 倍と 3 倍に自動的に拡大されます。これは、PROCESS_DPI_UNAWARE が常に DPI 96 を前提としており、システムがその点を考慮するためです。このアプリがウィンドウ サイズを問い合わせた場合、どのディスプレイ上にあるかにかかわらず、常に 500 × 500 の値が返されます。3 台のモニターのいずれかの DPI を問い合わせた場合も、96 が返されます。

次に、PROCESS_SYSTEM_DPI_AWARE のアプリケーションを考えます。この例ではシステム DPI が 200%、すなわち 192 DPI であることを思い出してください。つまり、このアプリが作成するウィンドウはディスプレイ B ではネイティブに描画されます。ウィンドウがディスプレイ A に移動すると、自動的に 2 分の 1 に縮小されます。これは、このシナリオの PROCESS_SYSTEM_DPI_AWARE アプリが DPI は常に 192 であると想定するためです。起動時に DPI を問い合わせ、その後は変更しません。システムはこれを補うために、ディスプレイ A に移動したときに自動的に縮小します。同様に、ウィンドウがディスプレイ C に移動した場合は、システムが自動的に 1.5 倍に拡大します。このアプリがウィンドウ サイズを問い合わせた場合は、PROCESS_DPI_UNAWARE と同様に常に同じ値が返されます。3 台のモニターのいずれかの DPI を問い合わせた場合は、192 が返されます。

他の認識値とは異なり、PROCESS_PER_MONITOR_DPI_AWARE は表示先のディスプレイに適応する必要があります。つまり、常にネイティブに描画され、システムによってスケーリングされることはありません。WM_DPICHANGED メッセージを受け取ったときに拡大縮小率を調整する責任は、アプリ側にあります。このメッセージには、ウィンドウの推奨される四角形が含まれます。この推奨値は、現在のウィンドウを古い DPI 値から新しい DPI 値へスケーリングしたものです。たとえば、ディスプレイ A 上で 500 × 500 のウィンドウをディスプレイ B に移動した場合は、1000 × 1000 の推奨ウィンドウ四角形が渡されます。同じウィンドウをディスプレイ C に移動した場合は、WM_DPICHANGED に付随する推奨ウィンドウ四角形は 1500 × 1500 になります。さらに、このアプリがウィンドウ サイズを問い合わせた場合は、常に実際のネイティブな値が返されます。同様に、3 台のモニターの DPI を問い合わせた場合は、それぞれ 96、192、288 が返されます。

DPI 仮想化のため、あるアプリケーションが認識レベルの異なる別のアプリケーションに対して DPI に依存する情報を問い合わせると、システムは呼び出し元の認識レベルに合わせて値を自動的にスケーリングします。その一例が、別のアプリケーションが作成したウィンドウを渡して GetWindowRect を呼び出す場合です。上記の状況で、PROCESS_DPI_UNAWARE のアプリがディスプレイ C 上に 500 × 500 のウィンドウを作成したとします。別のアプリケーションからそのウィンドウの四角形を問い合わせると、返される四角形のサイズは、自分のアプリの DPI 認識に応じて変化します。

PROCESS_DPI_UNAWARE システムは DPI 96 を前提とし、実際の四角形を自動的に 3 分の 1 に縮小するため、500 × 500 の四角形が返されます。
PROCESS_SYSTEM_DPI_AWARE システムは DPI 192 を前提とし、実際の四角形を自動的に 3 分の 2 に縮小するため、1000 × 1000 の四角形が返されます。
PROCESS_PER_MONITOR_DPI_AWARE システムはディスプレイの実際の DPI を使用し、内部でスケーリングを行わないため、1500 × 1500 の四角形が返されます。

次のスニペットは、アプリケーション マニフェストで PROCESS_SYSTEM_DPI_AWARE の値を設定する方法を示しています。

<dpiAware>true</dpiAware>

次のスニペットは、アプリケーション マニフェストで PROCESS_PER_MONITOR_DPI_AWARE の値を設定する方法を示しています。

<dpiAware>true/PM</dpiAware>
出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での定義

列挙メンバーの定義。HSP タブは #define global(値は16進)。

typedef enum PROCESS_DPI_AWARENESS : int {
    PROCESS_DPI_UNAWARE = 0,
    PROCESS_SYSTEM_DPI_AWARE = 1,
    PROCESS_PER_MONITOR_DPI_AWARE = 2
} PROCESS_DPI_AWARENESS;
public enum PROCESS_DPI_AWARENESS : int
{
    PROCESS_DPI_UNAWARE = 0,
    PROCESS_SYSTEM_DPI_AWARE = 1,
    PROCESS_PER_MONITOR_DPI_AWARE = 2,
}
Public Enum PROCESS_DPI_AWARENESS As Integer
    PROCESS_DPI_UNAWARE = 0
    PROCESS_SYSTEM_DPI_AWARE = 1
    PROCESS_PER_MONITOR_DPI_AWARE = 2
End Enum
import enum

class PROCESS_DPI_AWARENESS(enum.IntEnum):
    PROCESS_DPI_UNAWARE = 0
    PROCESS_SYSTEM_DPI_AWARE = 1
    PROCESS_PER_MONITOR_DPI_AWARE = 2
// PROCESS_DPI_AWARENESS
pub const PROCESS_DPI_UNAWARE: i32 = 0;
pub const PROCESS_SYSTEM_DPI_AWARE: i32 = 1;
pub const PROCESS_PER_MONITOR_DPI_AWARE: i32 = 2;
// PROCESS_DPI_AWARENESS
const (
	PROCESS_DPI_UNAWARE int32 = 0
	PROCESS_SYSTEM_DPI_AWARE int32 = 1
	PROCESS_PER_MONITOR_DPI_AWARE int32 = 2
)
const
  PROCESS_DPI_UNAWARE = 0;
  PROCESS_SYSTEM_DPI_AWARE = 1;
  PROCESS_PER_MONITOR_DPI_AWARE = 2;
// PROCESS_DPI_AWARENESS
pub const PROCESS_DPI_UNAWARE: i32 = 0;
pub const PROCESS_SYSTEM_DPI_AWARE: i32 = 1;
pub const PROCESS_PER_MONITOR_DPI_AWARE: i32 = 2;
const
  PROCESS_DPI_UNAWARE* = 0
  PROCESS_SYSTEM_DPI_AWARE* = 1
  PROCESS_PER_MONITOR_DPI_AWARE* = 2
enum PROCESS_DPI_AWARENESS : int {
    PROCESS_DPI_UNAWARE = 0,
    PROCESS_SYSTEM_DPI_AWARE = 1,
    PROCESS_PER_MONITOR_DPI_AWARE = 2,
}
#define global PROCESS_DPI_UNAWARE           0x0
#define global PROCESS_SYSTEM_DPI_AWARE      0x1
#define global PROCESS_PER_MONITOR_DPI_AWARE 0x2