2

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

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 的分辨率和 96 的 DPI。

但是,如果 Aero 关闭,结果会如我所料返回。Aero 在做什么?如何获得真正的分辨率和 DPI?

4

2 回答 2

7

您需要在清单(首选)中或使用Win32 API 函数将您的应用程序声明为 DPI-aware 。SetProcessDPIAware因为很多应用程序没有正确编写,Vista 添加了“DPI 虚拟化”,让应用程序假装它们正在使用“标准”96dpi 屏幕,然后自己进行缩放 - DWM 作为合成窗口管理器可以做到缩放。如果您的应用程序正确处理不同的 DPI,您必须明确说明。

顺便说一句,你不应该搞砸HWND_DESKTOP(这就是事实(HWND)0)。当合成(“Aero”)关闭时,它确实代表了物理屏幕,所以如果你得到它的 DC 并在它上面绘图,你就直接在帧缓冲区中绘图。使用合成窗口管理器,这在定义上是不可能的。我不确定这是否会影响 DPI 测量,但无论如何将 DC 用于您的应用程序窗口可能是一个更好的主意 - 它不会伤害/

于 2009-08-26T18:47:00.937 回答
0

这些链接还提供了有用的信息:

http://msdn.microsoft.com/en-us/library/dd464660(VS.85).aspx

http://blogs.msdn.com/greg_schechter/archive/2006/08/07/690704.aspx

于 2009-08-26T19:57:42.713 回答