.net Aero是否操纵DPI和屏幕大小?为什么?
在我的应用程序中,我使用以下代码获得屏幕分辨率:.net Aero是否操纵DPI和屏幕大小?为什么?,.net,aero,.net,Aero,在我的应用程序中,我使用以下代码获得屏幕分辨率: SystemInformation.PrimaryMonitorSize using (Graphics g = Graphics.FromHdc(NativeMethods.GetDC(IntPtr.Zero))) { dpiX = g.DpiX; dpiY = g.DpiY; } 我用以下代码获得DPI: SystemInformation.PrimaryMonitorSize
SystemInformation.PrimaryMonitorSize
using (Graphics g = Graphics.FromHdc(NativeMethods.GetDC(IntPtr.Zero)))
{
dpiX = g.DpiX;
dpiY = g.DpiY;
}
我用以下代码获得DPI:
SystemInformation.PrimaryMonitorSize
using (Graphics g = Graphics.FromHdc(NativeMethods.GetDC(IntPtr.Zero)))
{
dpiX = g.DpiX;
dpiY = g.DpiY;
}
这在大多数情况下都很好。但是,当代码在打开Aero的Vista机器上运行时,用户将显示器设置为使用高DPI时,奇怪的结果又出现了
假设用户已将机器设置为1024 x 768运行,且DPI为144,则上述代码将返回683 x 512的分辨率和96的DPI
然而,如果关闭Aero,结果会像我预期的那样回来。Aero在做什么?如何获得真正的分辨率和DPI?您需要,或者在清单中(首选),或者使用SetProcessDPIAware
Win32 API函数。由于许多应用程序编写不正确,Vista添加了“DPI虚拟化”,让应用程序假装使用“标准”96dpi屏幕,然后自己进行缩放-DWM作为合成窗口管理器,可以进行缩放。如果您的应用程序正确地处理不同的DPI,那么您必须明确地这样说
另一方面,你不应该乱动桌面(这就是
(HWND)0
)。当合成(“Aero”)处于禁用状态时,它确实表示物理屏幕,因此如果您获取其DC并在其上绘制,则直接绘制到帧缓冲区中。使用合成窗口管理器,这是不可能的。我不确定这是否会影响DPI测量,但无论如何,使用DC作为应用程序窗口可能是一个更好的主意-这不会有任何伤害/这些链接还提供了有用的信息:
+1这完全正确。微软放弃了恳求开发者让他们的应用程序在除96dpi以外的dpi设置下正常工作的尝试。如果用户选择高dpi,那么大多数应用程序将被破坏,而开发人员现在已经表示他们支持高dpi。用户仍然可以禁用每个程序的缩放(右键单击“兼容性”选项卡)