前段时间我正在研究 DPI 问题,当时一位同事开始使用高 DPI 显示器。
我的方法是询问桌面,而不是 Dpi 的特定窗口。当我遇到一些麻烦时,我想出了这段代码(不是很漂亮,但对我来说效果很好):
/// <summary>
/// Assesses the Systems Primary Monitor's DPI value
/// </summary>
public static double DPI {
get {
Graphics g = Graphics.FromHwnd(IntPtr.Zero);
IntPtr desktop = g.GetHdc();
int LogicalScreenHeight = GetDeviceCaps(desktop, (int)DeviceCap.VERTRES);
int PhysicalScreenHeight = GetDeviceCaps(desktop, (int)DeviceCap.DESKTOPVERTRES);
float ScreenScalingFactor = (float)PhysicalScreenHeight / (float)LogicalScreenHeight;
// dpi1 answers correctly if application is "dpiaware=false"
int dpi1 = (int)(96.0 * ScreenScalingFactor);
// dpi2 answers correctly if application is "dpiaware=true"
int dpi2 = GetDeviceCaps(desktop, (int)DeviceCap.LOGPIXELSX);
return Math.Max(dpi1, dpi2);
}
}
[DllImport("gdi32.dll")]
static private extern int GetDeviceCaps(IntPtr hdc, int nIndex);
private enum DeviceCap {
VERTRES = 10,
DESKTOPVERTRES = 117,
LOGPIXELSX = 88,
// http://pinvoke.net/default.aspx/gdi32/GetDeviceCaps.html
}
我特别不喜欢使用 hack 的方法Math.Max(dpi1, dpi2)
,但目前我没有找到更好的解决方案。
至于你原来的问题,在 Win10 上我看不到视觉效果的变化。抱歉,这里不知道。