PROCESS_DPI_AWARENESS 列挙 (shellscalingapi.h)

1 インチあたりのドット数 (dpi) の認識値を識別します。 DPI 認識は、DPI に対してアプリケーションが実行するスケーリング作業の量と、システムによって実行される量を示します。

ユーザーは、ディスプレイの DPI スケール ファクターを相互に独立して設定できます。 一部のレガシ アプリケーションでは、複数の DPI 設定のスケーリングを調整できません。 ユーザーがディスプレイに表示されるコンテンツが大きすぎたり小さすぎたりせずにこれらのアプリケーションを使用するために、Windows は DPI 仮想化をアプリケーションに適用できるため、システムによって現在のディスプレイの DPI に合わせて自動的にスケーリングされます。 PROCESS_DPI_AWARENESS値は、アプリケーションが独自に処理するスケーリングのレベルと、Windows によって提供される量を示します。 システムによってスケーリングされたアプリケーションがぼやけて表示され、互換性を維持するためにモニターに関する仮想化データが読み取られます。

構文

typedef enum PROCESS_DPI_AWARENESS {
  PROCESS_DPI_UNAWARE = 0,
  PROCESS_SYSTEM_DPI_AWARE = 1,
  PROCESS_PER_MONITOR_DPI_AWARE = 2
} ;

定数

 
PROCESS_DPI_UNAWARE
値: 0
DPI を認識する必要があります。 このアプリは DPI の変更に対してスケーリングされず、常に 100% (96 DPI) のスケール ファクターを持つものと見なされます。 他の DPI 設定では、システムによって自動的にスケーリングされます。
PROCESS_SYSTEM_DPI_AWARE
値: 1
システム DPI 対応。 このアプリは DPI の変更に合わせてスケーリングされません。 DPI に対して 1 回クエリを実行し、アプリの有効期間にその値を使用します。 DPI が変更された場合、アプリは新しい DPI 値に調整されません。 DPI がシステム値から変化すると、システムによって自動的にスケールアップまたはスケールダウンされます。
PROCESS_PER_MONITOR_DPI_AWARE
値: 2
モニターごとの DPI 対応。 このアプリは、DPI が作成されたときに DPI をチェックし、DPI が変更されるたびにスケール ファクターを調整します。 これらのアプリケーションは、システムによって自動的にスケーリングされません。

注釈

重要  

以前のバージョンの 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 アプリは、DPI の変化を認識して対応する役割を 担い、WM_DPICHANGEDによって通知されます。 これらはシステムによってスケーリングされません。 この種類のアプリがウィンドウとそのコンテンツのサイズを変更しない場合、ウィンドウが別の DPI 設定で 1 つのディスプレイから別のディスプレイに移動されると、相対的な DPI の変化によって拡大または縮小しているように見えます。
ヒント  

以前のバージョンの Windows では、 PROCESS_PER_MONITOR_DPI_AWAREの設定はありませんでした。 アプリは DPI 対応または DPI 対応でした。 Windows 8.1より前に DPI 対応として分類されたレガシ アプリケーションは、現在のバージョンの Windows でPROCESS_SYSTEM_DPI_AWAREPROCESS_DPI_AWARENESS設定を持つと見なされます。

 
異なる 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) のスケーリング係数が使用されます。 このシナリオでは、サイズが 500 ~ 500 の PROCESS_DPI_UNAWARE ウィンドウが作成されます。 ディスプレイ 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 倍ずつ自動的にスケールダウンされます。 これは、このシナリオの PROCESS_SYSTEM_DPI_AWARE アプリでは、DPI が常に 192 であると想定しているためです。 起動時に DPI に対してクエリを実行し、変更することはありません。 システムは、A を表示するように移動するときに自動的にスケールダウンすることで、これに対応します。同様に、ウィンドウが C を表示するように移動すると、システムは 1.5 倍に自動的にスケールアップされます。 アプリがウィンドウ サイズを照会する場合、 PROCESS_DPI_UNAWAREと同様に、常に同じ値が取得されます。 3 台のモニターの DPI を求める場合は、192 を受け取ります。

他の認識値とは異なり、 PROCESS_PER_MONITOR_DPI_AWARE は表示されているディスプレイに適応する必要があります。 つまり、常にネイティブにレンダリングされ、システムによってスケーリングされることはありません。 アプリでは、 WM_DPICHANGED メッセージを受信するときにスケール ファクターを調整する必要があります。 このメッセージの一部には、ウィンドウの推奨される rect が含まれています。 この提案は、古い DPI 値から新しい DPI 値にスケーリングされた現在のウィンドウです。 たとえば、ディスプレイ A に 500 ~ 500 のウィンドウがあり、表示 B に移動すると、1000 から 1000 までの推奨ウィンドウの rect が表示されます。 同じウィンドウが C を表示するように移動された場合、 WM_DPICHANGED にアタッチされている推奨ウィンドウの修正は 1500 から 1500 になります。 さらに、このアプリがウィンドウ サイズを照会すると、常に実際のネイティブ値が取得されます。 同様に、3 台のモニターの DPI を求める場合は、それぞれ 96、192、288 を受け取ります。

DPI 仮想化により、あるアプリケーションが DPI に依存する情報に対して異なる認識レベルで別のアプリケーションに対してクエリを実行すると、呼び出し元の認識レベルに合わせて値が自動的にスケーリングされます。 この例の 1 つは、 GetWindowRect を 呼び出し、別のアプリケーションによって作成されたウィンドウを渡す場合です。 上記の状況を使用して、 PROCESS_DPI_UNAWARE アプリがディスプレイ C に 500 by 500 ウィンドウを作成したとします。別のアプリケーションからウィンドウの修正を照会する場合、rect のサイズはアプリの DPI 認識によって異なります。

PROCESS_DPI_UNAWARE システムでは DPI が 96 と想定され、実際のリクトが 3 倍に自動的にスケールダウンされるため、500 から 500 の解像度が得られます。
PROCESS_SYSTEM_DPI_AWARE システムでは DPI が 192 と想定され、実際の rect が 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>

要件

要件
サポートされている最小のクライアント Windows 8.1 [デスクトップ アプリのみ]
サポートされている最小のサーバー Windows Server 2012 R2 [デスクトップ アプリのみ]
Header shellscalingapi.h

こちらもご覧ください

DPI_AWARENESS