在我的应用程序中,我使用以下代码获得屏幕分辨率:
SystemInformation.PrimaryMonitorSize
我用这段代码得到了DPI:
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且DPI为96.
但是,如果关闭Aero,结果会像我预期的那样回归。 Aero在做什么以及如何获得真正的分辨率和DPI?
答案 0 :(得分:7)
您需要declare your application as DPI-aware,在清单(首选)中,或使用SetProcessDPIAware
Win32 API函数。由于许多应用程序编写不正确,Vista增加了“DPI虚拟化”,让应用程序假装他们正在使用“标准”96dpi屏幕,然后进行扩展本身 - 作为合成窗口管理器的DWM可以做缩放。如果您的应用程序正确处理不同的DPI,您必须明确说明。
在旁注中,您不应该使用HWND_DESKTOP
(这是(HWND)0
)。当合成(“Aero”)关闭时,它确实代表了物理屏幕,所以如果你得到DC并在它上画画,你就直接绘制到帧缓冲区。使用合成窗口管理器,这是不可能的by definition。我不确定这是否会影响DPI测量,但最好还是将DC用于您的应用程序窗口 - 它不会受到伤害/
答案 1 :(得分:0)