Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net Aero是否操纵DPI和屏幕大小?为什么?_.net_Aero - Fatal编程技术网

.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。用户仍然可以禁用每个程序的缩放(右键单击“兼容性”选项卡)