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

epo*_*ter 2 .net aero

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

SystemInformation.PrimaryMonitorSize
Run Code Online (Sandbox Code Playgroud)

我用这段代码得到了DPI:

    using (Graphics g = Graphics.FromHdc(NativeMethods.GetDC(IntPtr.Zero)))
    {
        dpiX = g.DpiX;
        dpiY = g.DpiY; 
    }
Run Code Online (Sandbox Code Playgroud)

这在大多数情况下工作正常.但是当代码在打开Aero的Vista机器上运行时,用户已将显示器设置为使用高DPI,奇怪的结果又回来了.

假设用户已将机器设置为1024 x 768并且DPI为144,则上面的代码将返回683 x 512的分辨率和96的DPI.

但是,如果关闭Aero,结果会像我期望的那样回归.Aero在做什么以及如何获得真正的分辨率和DPI?

Pav*_*aev 7

您需要在清单(首选)或使用Win32 API函数中将应用程序声明为DPI感知SetProcessDPIAware.由于许多应用程序编写不正确,Vista增加了"DPI虚拟化",让应用程序假装他们正在使用"标准"96dpi屏幕,然后进行扩展本身 - 作为合成窗口管理器的DWM可以做缩放.如果您的应用程序正确处理不同的DPI,您必须明确说明.

另一方面,你不应该捣乱HWND_DESKTOP(这是什么(HWND)0).当合成("Aero")关闭时,它确实代表了物理屏幕,所以如果你得到DC并在它上画画,你就直接绘制到帧缓冲区.使用合成窗口管理器,根据定义,这是不可能.我不确定这是否会影响DPI测量,但最好将DC用于您的应用程序窗口 - 无论如何它都不会伤害/