我试图在MSDN上find这个答案,但是我没有清楚地知道这是如何工作的。 我所有的工作都在Windows 8.1上。
这是我的问题。 我正在使用高分辨率显示器3200×1800的笔记本电脑。 我一直在使用EnumDisplayMonitors来获取我的屏幕的边界矩形。
这似乎工作正常,如果我的显示设置是默认的。 但是我注意到,当我改变窗口显示设置来提供更大的文本时,EnumDisplayMonitor返回的分辨率发生了变化。 而不是得到3200×1800我会得到2133×1200。
我猜是因为我要求更大的文本,Windowsselect将屏幕表示为更小的分辨率。
看来,如果我看虚拟屏幕属性,一切都performance在我的屏幕的实际坐标,即3200×1800。 但是获取窗口和监视矩形的API似乎在这个“其他”坐标空间上运行。
是否有任何文档/ Windows API来处理这些“其他坐标”和“虚拟坐标”之间的转换? 即如果我想让EnumDisplayMonitor或GetMonitorInfo给我真正的屏幕坐标,我怎么能将2133×1200转换为3200×1800?
您已将视频适配器的DPI增加到150%(每英寸144点)以保持文本可读,并避免使用窗口大小的邮票。 这种高分辨率显示器非常必要。 但是你没有告诉Windows你的程序知道如何处理它。
所以它假设你的程序是一个从来没有被设计成在这样的显示器上运行的程序。 它对你有帮助和谎言。 它让你的程序把它的输出渲染到一个内存缓冲区,然后取得这个输出,重新调整它150%,并将它复制到视频适配器。 这是你可以看到的东西,如果你把你的程序的输出放在一个不需要这种缩放的程序旁边,那么文本看起来就很模糊,就像记事本一样。
当然,当你询问屏幕的大小时,它就在于你。 它告诉你它比实际上小了150%。 因此,重新缩放后,您创建的窗口将填满屏幕。
这一切都很好,但当然不是很理想,你的程序看起来不像应该的那么好。 你必须告诉Windows , 你知道如何处理更高的分辨率。 要小心,这看起来比实践中更容易。 使文本看起来很脆弱是微不足道的,这是位图是有问题的。 一般而言,臭虫源源不断,即使是大公司也可能弄错 。
在我开始回答问题之前,让我问: 你真正想做什么? 或者更具体的 – 为什么你需要知道显示器分辨率 ? 执行此操作的标准方法是调用GetWindowRect(GetDesktopWindow(), &rect)
我不确定屏幕坐标是否基于DPI设置进行了更改 – 但是您应该尝试使用GetMonitorInfo而不是GetMonitorInfo,因为后者用于更高级的内容。 如果GetWindowRect仍然返回缩放的矩形,只需调用DPtoLP , LPtoDP或其他映射坐标函数 。
如上所述调整显示设置时,实际上是在更改屏幕的DPI设置。 因此,某些API进入兼容模式,以便它们允许应用程序创建更大的元素和窗口,而无需了解此设置。
为什么您需要知道实际的屏幕分辨率,因为大多数窗口API将在DPI缩放更改时相应地运行?
我怀疑你可以调用SetProcessDPIAware或相应的清单文件。 但是请先阅读这篇MSDN文章 ,了解DPI缩放。