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を使用することです。
アプリが PROCESS_DPI_UNAWAREされている場合は、アプリケーション マニフェストに値を設定する必要はありません。 PROCESS_DPI_UNAWARE は、別の値が指定されていない限り、アプリの既定値です。
以前のバージョンの Windows では、 PROCESS_PER_MONITOR_DPI_AWAREの設定はありませんでした。 アプリは DPI 対応または DPI 対応でした。 Windows 8.1より前に DPI 対応として分類されたレガシ アプリケーションは、現在のバージョンの Windows でPROCESS_SYSTEM_DPI_AWAREのPROCESS_DPI_AWARENESS設定を持つと見なされます。
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 |