Windows设备坐标与虚拟坐标

Windows设备坐标与虚拟坐标,windows,coordinates,Windows,Coordinates,我试图在MSDN上找到答案,但我不清楚这是如何工作的。我所有的工作都是在Windows8.1上完成的 这是我的问题。我正在使用一台配有高分辨率显示器3200x1800的笔记本电脑。我一直在使用EnumDisplayMonitors获取屏幕的边框 如果我的显示设置是默认设置,这似乎可以正常工作。但我注意到,当我更改窗口显示设置以提供更大的文本时,EnumDisplayMonitor返回的分辨率会发生变化。我将得到2133x1200而不是3200x1800 我猜,因为我要求更大的文本,Windows

我试图在MSDN上找到答案,但我不清楚这是如何工作的。我所有的工作都是在Windows8.1上完成的

这是我的问题。我正在使用一台配有高分辨率显示器3200x1800的笔记本电脑。我一直在使用EnumDisplayMonitors获取屏幕的边框

如果我的显示设置是默认设置,这似乎可以正常工作。但我注意到,当我更改窗口显示设置以提供更大的文本时,EnumDisplayMonitor返回的分辨率会发生变化。我将得到2133x1200而不是3200x1800

我猜,因为我要求更大的文本,Windows选择以更小的分辨率表示屏幕

如果我查看虚拟屏幕属性,似乎所有内容都以屏幕的实际坐标表示,即3200x1800。但是获取窗口和监视器矩形的API似乎在这个“其他”坐标空间上运行


是否有任何文档/Windows API来处理这些“其他坐标”和“虚拟坐标”之间的转换?i、 e.如果我想让EnumDisplayMonitor或GetMonitorInfo提供真实的屏幕坐标,我如何将2133x1200转换为3200x1800?

在我开始回答之前,让我问一下:你到底想做什么?或者更具体地说,为什么您需要知道监视器的分辨率?执行此操作的标准方法是调用
GetWindowRect(GetDesktopWindow(),&rect)
我不确定屏幕坐标是否会根据DPI设置而改变,但您应该尝试使用它,而不是GetMonitorInfo,因为后者用于更高级的内容。如果GetWindowRect仍然返回一个缩放的rect,只需调用,或者根据需要调用

如前所述调整显示设置时,实际上是在更改屏幕的DPI设置。因此,某些API进入兼容模式,因此它们允许应用程序在不了解此设置的情况下创建更大的元素和窗口

为什么您需要知道实际的屏幕分辨率,因为当DPI比例改变时,大多数窗口API都会相应地工作


我想你可以调用或清单文件的等效文件。但一定要先阅读以了解DPI缩放。

您已将视频适配器的DPI增加到150%(每英寸144点),以保持文本可读性,并避免使用邮票大小的窗口。在这种高分辨率显示器上非常必要。但是您还没有告诉Windows您的程序知道如何处理它

因此,它假设您的程序是一个旧的程序,从来没有设计过在这样的监视器上运行。它对你有帮助,对你撒谎。它让您的程序将其输出渲染到内存缓冲区,然后获取该输出,将其重新缩放150%,并将其复制到视频适配器。这是你可以看到的,如果你把程序的输出放在一个不需要这种缩放的程序旁边,比如记事本,文本看起来更模糊

当然,当你要求屏幕的大小时,这取决于你。它告诉你它比实际的小150%。这样,在重新缩放后,您创建的窗口将填充屏幕


这一切都很好,但当然不理想,你的程序看起来并不像它应该的那么好。你知道如何处理更高的分辨率。一定要注意,这看起来比实际情况更容易。让文本看起来清晰是件小事,位图才是问题所在。总的来说,这是虫子的肥沃来源,甚至是。

啊,我想这就是答案。我感到非常困惑,因为无论我做了什么更改,我从列举监视器设备得到的DPI总是相同的。但决议不断变化。听起来Windows好像在骗我。那么现在我想问一个后续问题,如果我现在不想知道我的应用程序的DPI,那么对我来说,找出DPI最简单的方法是什么?有没有办法计算呢?如果你喜欢被骗,那你就不在乎可能是什么。你只需假设96 dpi,但我想知道各种显示器和窗口的实际分辨率是多少。似乎windows提供的所有API只有在我的应用程序具有“DPI感知”的情况下才能起作用。所以我想知道我是否可以在不知道DPI的情况下进行这些转换。关闭谎言需要声明您的程序dpiAware。严格要求。嗯,我注意到的一件事是,即使我的显示器分辨率报告为2133x1200,但如果我使用设备枚举获得显示器分辨率,它报告为3200x1800。使用这些数据来估计DPI是否安全,以便我可以适当调整?