Die Verwendung der Antwort von Farshid T als Basis funktioniert in jedem Skalierungsfaktor mit Ausnahme von 125%. Ich habe ungefähr 20 verschiedene Skalierungsfaktoren getestet, und der DPI gibt immer 96 zurück, außer wenn er auf 125% eingestellt ist, was einen DPI von 120 ergibt. 120/96 = 1,25. Ich bin mir nicht sicher, warum dies der Fall ist, aber dieser Code scheint für jede Skalierungseinstellung zu funktionieren.
[DllImport("gdi32.dll")]
static extern int GetDeviceCaps(IntPtr hdc, int nIndex);
public enum DeviceCap
{
VERTRES = 10,
DESKTOPVERTRES = 117,
LOGPIXELSY = 90,
und Verwendung:
Graphics g = Graphics.FromHwnd(IntPtr.Zero);
IntPtr desktop = g.GetHdc();
int LogicalScreenHeight = GetDeviceCaps(desktop, (int)DeviceCap.VERTRES);
int PhysicalScreenHeight = GetDeviceCaps(desktop, (int)DeviceCap.DESKTOPVERTRES);
int logpixelsy = GetDeviceCaps(desktop, (int)DeviceCap.LOGPIXELSY);
float screenScalingFactor = (float)PhysicalScreenHeight / (float)LogicalScreenHeight;
float dpiScalingFactor = (float)logpixelsy / (float)96;
if (screenScalingFactor > 1 ||
dpiScalingFactor > 1)
{
}