Aero是否操纵DPI和屏幕尺寸?为什么?

时间:2009-08-26 18:30:36

标签: .net aero

在我的应用程序中,我使用以下代码获得屏幕分辨率:

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?

2 个答案:

答案 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)