私は同じ問題を抱えています.GetDC + GetDeviceCaps + ReleaseDCを使用してみましたが、少なくともVista32ではグラフィックスを使用していました. 私はまだ DPI の経験がありませんが、誰もこれに答えておらず、少なくともこれは他の人にとって役立つかもしれません.
DPI 対応アプリケーションの作成 を参照してください。これは、実際の DPI 設定に関係なく、常に 96 を返す理由について言及しています。
上記リンクより引用:
Win32 アプリケーションでの DPI スケーリング
Win32 アプリケーションでは、次の操作を行います。
- SetProcessDPIAware 関数を使用して、dpi スケーリングをキャンセルします。
- 描画されたインターフェイス要素のサイズを変更するときは、センチメートルなどの物理的な測定値を使用してください。ピクセルではなく物理的な寸法を使用することで、すべてのタイプのディスプレイで一貫したサイズを確保できます。
- システムの dpi 設定を取得するには、CDC::GetDeviceCaps 関数を LOGPIXELSX フラグと共に使用します。dpi スケーリングをキャンセルしない場合、この呼び出しはデフォルト値の 96 dpi を返します。
- GetSystemMetrics 関数を使用して、ウィンドウの境界線などのユーザー インターフェイス要素の適切なサイズを取得します。dpi スケーリングが無効になっている場合、インターフェイス要素に対して返される測定値は、選択した dpi 設定にスケーリングされます。dpi スケーリングがアクティブな場合、関数は、システムの dpi 設定に関係なく、96 dpi に基づいて測定値を返します。
回答元: DPI の問題について
using -statementで書き直したサンプル コード(元のソース):
float dpiX = 96, dpiY = 96;
using(Graphics graphics = this.CreateGraphics())
{
dpiX = graphics.DpiX;
dpiY = graphics.DpiY;
}